• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Problema risolto Passare puntatore di una classe ad un metodo...

gedamial

Utente Senior
Autore del topic
9 Giugno 2010
1.937
69
Miglior risposta
0
Salve.

Stavo creando un "giochino" in C++ e ho dovuto creare diverse classi. Il sorgente è abbastanza grande, quindi vi riporto il codice per farvi un esempio snello.

Analisi:
Classe giocatore che definisce le info sul giocatore (vita, armatura, nome giocatore...)
Classe armi che definisce il danno dell'arma e le munizioni. Inoltre, in questa classe c'è un metodo usato per colpire il giocatore.

Chi è perspicace capisce che, per usare il metodo Colpisci() ho bisogno del riferimento a un oggetto della classe Player. Mi serve perchè poi dal quel metodo devo decidere quanta vita togliergli (in base al danno) ecc...

Ma il punto è che devo passare per riferimento l'oggetto della classe Player al metodo della classe Weapons.
Ho creato un oggetto-puntatore Player (usando quindi l'allocazione esplicita con new):

Player* giocatore = new Player(...);

...e un arma...

Weapons* lanciarazzi = new Weapons(...);

Ad un certo punto del codice chiamerò il metodo lanciarazzi->Colpisci(giocatore) il cui prototipo è void Colpisci(Player &player)

[N.B.] NOTA BENE [N.B]

Quando chiamo il metodo Colpisci(), all'interno delle parentesi scrivo SOLO IL NOME della variabile-puntatore-a-classe.
Nel prototipo del metodo Colpisci(), INVECE, uso la e-commerciale (&) proprio perché io voglio prendere IL RIFERIMENTO di quel puntatore-a-classe.

Voglio? Mmh... vorrei...

Il compilatore mi Colpisce() :emoji_relieved:

SCREEN:
Perfavore, Entra oppure Registrati per vedere i Link!


Allora mi son dato alla ricerca del problema e sono arrivato alla SOLUZIONE

PRIMA [ERRORE]
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

DOPO [GOOD]
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Bastardino quel *

Tutto questo post per dirvi: che cavolo cambia? -.-
@TBH @System32 @nothing
 
Ultima modifica:
@gedamial

semplice dato che hai scritto &player ,si presume che al metodo ci passi un oggetto/valore e non a un indirizzo di memoria.^^
 
@gedamial

semplice dato che hai scritto &player ,si presume che al metodo ci passi un oggetto/valore e non a un indirizzo di memoria.^^

Allora perché, nel caso di una variabile qualunque, il seguente metodo funziona a meraviglia?

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Quando CHIAMO il metodo non esplicito la &, mentre nella lista dei parametri in entrata alla dichiarazione del metodo Change() si...
 
Allora perché, nel caso di una variabile qualunque, il seguente metodo funziona a meraviglia?

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Quando CHIAMO il metodo non esplicito la &, mentre nella lista dei parametri in entrata alla dichiarazione del metodo Change() si...

tu passi un semplice valore e la & , operatore di indirizzamento , si limita ad ottenere l'indirizzo di a
 
tu passi un semplice valore e la & , operatore di indirizzamento , si limita ad ottenere l'indirizzo di a

Bene. E non potrebbe essere lo stesso per un oggetto-puntatore?

- - - Aggiornato - - -

tu passi un semplice valore e la & , operatore di indirizzamento , si limita ad ottenere l'indirizzo di a

Bene. E non potrebbe essere lo stesso per un oggetto-puntatore?
 
Bene. E non potrebbe essere lo stesso per un oggetto-puntatore?

- - - Aggiornato - - -



Bene. E non potrebbe essere lo stesso per un oggetto-puntatore?

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

si presume che passi un tipo player e non puntatore a player. per questo devi usare *, che non fa altro che restituire il contenuto di un indirizzo di memoria valido
 
l'hai scritto te eh xd
Player* giocatore

Oddio che confusione XD

Allora famo una cosa.

Nell'esempio Change(a) io passo la variabile senza utilizzare ne & ne * prima del nome della variabile.
Nell'esempio Colpisci(*player) io passo l'oggetto UTILIZZANDO * prima del nome dell'oggetto

Si ha quindi che:

-con una variabile normale non metto nulla
-con un oggetto metto *

MA l'argomento che richiede il metodo Change() è uguale all'argomento che richiede Colpisci() INFATTI, IN ENTRAMBI viene messo & prima del nome della variabile

Change(int &a){}
Colpisci(Player &player){}

Conclusione: l'argomento è lo stesso, ma cambia il MODO IN CUI VIENE INVIATO il parametro
 
Oddio che confusione XD

Allora famo una cosa.

Nell'esempio Change(a) io passo la variabile senza utilizzare ne & ne * prima del nome della variabile.
Nell'esempio Colpisci(*player) io passo l'oggetto UTILIZZANDO * prima del nome dell'oggetto

Si ha quindi che:

-con una variabile normale non metto nulla
-con un oggetto metto *

MA l'argomento che richiede il metodo Change() è uguale all'argomento che richiede Colpisci() INFATTI, IN ENTRAMBI viene messo & prima del nome della variabile

Change(int &a){}
Colpisci(Player &player){}

Conclusione: l'argomento è lo stesso, ma cambia il MODO IN CUI VIENE INVIATO il parametro

no non cambia e comunque ti stai confondendo.

Player* giocatore = new Player(...);
//ottieni il riferimento dell'oggetto player, in pratica il puntatore a player contiene un indirizzo di memoria che fa riferimento all'oggetto player
//cout<<giocatore<<endl; //ti stampa l'indirizzo
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

l'operatore & , partendo da un determinato tipo ne ottiene l'indirizzo.
ora dato che il tuo giocatore è un puntatore e tu devi passare il contenuto di player devi usare *, per ottenere il contenuto.
 
no non cambia e comunque ti stai confondendo.

Player* giocatore = new Player(...);
//ottieni il riferimento dell'oggetto player, in pratica il puntatore a player contiene un indirizzo di memoria che fa riferimento all'oggetto player
//cout<<giocatore<<endl; //ti stampa l'indirizzo
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

l'operatore & , partendo da un determinato tipo ne ottiene l'indirizzo.
ora dato che il tuo giocatore è un puntatore e tu devi passare il contenuto di player devi usare *, per ottenere il contenuto.

In pratica mandando come parametro *giocatore mandiamo il contenuto, mentre mandando giocatore mandiamo l'indirizzo giusto? (rispondi a questa cosa <-)

Allora il metodo Colpisci(Player &player), con quella & sta a dire che vuole il contenuto o l'indirizzo?
 
si

il suo contenuto ^^

Eccoooo, tutto combacia finalmente!

Quindi, focalizzandosi sul METODO

Change(Player &player){}
Questo qui usa l'ampersand per ACCEDERE all'indirizzo del puntatore [richiede *]

Change(Player *player){}
Questo invece? Come si differenzia dal precedente?
 
Eccoooo, tutto combacia finalmente!

Quindi, focalizzandosi sul METODO

Change(Player &player){}
Questo qui usa l'ampersand per ACCEDERE all'indirizzo del puntatore [richiede *]

Change(Player *player){}
Questo invece? Come si differenzia dal precedente?

accetta un puntatore quindi scrivere una cosa del genere era valida:
Change(giocatore);