Передать этот объект в список инициализации

Я сократил проблему до следующего примера кода:

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

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

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

Без изменения или добавления общедоступных членов, как я могу создать конструктор для тренера, чтобы при создании myPokemon в списке инициализации «myTrainer» указывал на создаваемого тренера?

Вот что я пробовал:

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

Но, конечно, "это" не правильный тип. Я не могу изменить то, что принимает конструктор Charizard (это общедоступный член), поэтому я не уверен, что делать. Любые идеи?

Примечание. Над названием может потребоваться доработка.


person Coltin    schedule 05.12.2010    source источник


Ответы (2)


Если вам нужен экземпляр объекта вместо указателя, попробуйте:

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

Будьте осторожны, если Charizard попытается вызвать какие-либо методы для tMyTrainer в своем конструкторе, потому что ваш новый объект trainer на тот момент еще не был полностью сконструирован.

person Greg Hewgill    schedule 05.12.2010
comment
Это именно то, что я искал, и спасибо за предупреждение. - person Coltin; 05.12.2010

Ожидается ссылочный тип — просто используйте *this вместо this.

Многие компиляторы в любом случае предупредят об этом: myPokemon будет построен до того, как будет выполнено trainer, поэтому он получает ссылку на несконструированный trainer. Будьте осторожны, не вызывайте для него какие-либо методы (или не используйте его данные), поскольку это приводит к неопределенному поведению!

person Fabian Giesen    schedule 05.12.2010