2010-12-05 7 views
3

J'ai réduit le problème à l'exemple de code suivant:Pass « ce » objet à une liste d'initialisation

class Charizard { //truck 
    trainer &myTrainer; 
    public: 
    Charizard(trainer &tMyTrainer); 
}; 

class trainer { 
    Charizard myPokemon; 
    public: 
    trainer(); 
}; 

Charizard::Charizard(trainer &tMyTrainer) : myTrainer(tMyTrainer) {} 

Sans modifier ou d'ajouter des membres du public, comment puis-je créer le constructeur de formateur, de sorte que Lorsque myPokemon est créé dans la liste d'initialisation, le "myTrainer" pointe-t-il vers le formateur en cours de création?

Voici ce que j'ai essayé:

trainer::trainer() : myPokemon(this) {} 

Mais bien sûr "ce" n'est pas le bon type. Je ne peux pas changer ce que le constructeur de Charizard accepte (c'est un membre public), donc je ne sais pas quoi faire. Des idées?

Note: Le titre pourrait nécessiter un peu de travail.

Répondre

5

Si vous avez besoin d'un objet par exemple au lieu d'un pointeur, essayez:

trainer::trainer() : myPokemon(*this) {} 

Soyez prudent si Charizard essaie d'appeler des méthodes sur tMyTrainer dans son constructeur, parce que votre nouvel objet trainer n'a pas encore été entièrement construit à ce moment-là.

+0

C'est exactement ce que je cherchais, et merci pour l'avertissement. – Coltin

4

Un type de référence est attendu - il suffit d'utiliser *this au lieu de this.

Beaucoup de compilateurs avertir de toute façon: myPokemon sera construit avant trainer est fait, il obtient une référence à un trainer non construit. Veillez à ne pas appeler de méthodes (ou utiliser ses données) car cela conduit à un comportement indéfini!