【问题标题】:Pass 'this' object to an initialization list将“this”对象传递给初始化列表
【发布时间】:2010-12-05 08:41:37
【问题描述】:

我已将问题简化为以下示例代码:

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) {}

当然,“this”不是正确的类型。我无法更改 Charizard 构造函数接受的内容(它是公共成员),所以我不确定该怎么做。有什么想法吗?

注意:标题可能需要修改。

【问题讨论】:

    标签: c++ constructor reference initialization-list


    【解决方案1】:

    如果您需要实例对象而不是指针,请尝试:

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

    如果Charizard 尝试在其构造函数中调用tMyTrainer 上的任何方法,请小心,因为此时您的新trainer 对象尚未完全构造。

    【讨论】:

    • 这正是我想要的,感谢您的警告。
    【解决方案2】:

    需要引用类型 - 只需使用 *this 而不是 this

    无论如何,很多编译器都会对此发出警告:myPokemon 将在 trainer 完成之前构造,因此它会引用非构造的 trainer。注意不要在其上调用任何方法(或使用其数据),因为它会导致未定义的行为!

    【讨论】:

      猜你喜欢
      • 2017-05-13
      • 2015-08-03
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 2014-08-17
      相关资源
      最近更新 更多