在C++中,在构造期间使用"this"指针初始化类成员

sun*_*ide 9 c++ initialization class this

我想创建一个与某个父子关系中的另一个类相关联的类.为此,"child"类需要引用它的父级.

例如:

template <typename T>
class TEvent {
    private: T* Owner;
    public: TEvent(T* parent) : Owner(parent) {}
};

class Foo {
    private: TEvent<Foo> Froozle; // see below
};
Run Code Online (Sandbox Code Playgroud)

现在的问题是我不能Froozle直接初始化实例,也不能使用Foo构造函数的实例化列表,因为this那里不允许引用.除了添加另一个方法setParent(T*)(我不太喜欢,因为这意味着我必须让TEvent<>实例处于无效状态),有没有办法实现这一点?

Bjö*_*lex 14

可以this在初始化列表中使用,只要它不用于访问可能尚未初始化的任何成员.


Mic*_*urr 11

从标准的12.6.2/7"初始化基础和成员"(强调我的):

mem-initializer的表达式列表中的名称在为其指定mem-initializer的构造函数的范围内进行计算.

[例:

class X {
    int a;
    int b;
    int i;
    int j;

public:
    const int& r;
    X(int i): r(a), b(i), i(i), j(this->i) {}
};
Run Code Online (Sandbox Code Playgroud)

初始化X::r引用X::a,X::b用构造函数参数的值i初始化, X::i用构造函数参数的值i初始化,并X::j用值 初始化X::i; 每次class X创建一个对象时都会发生这种情况.]

[注意:因为mem-initializer是在构造函数的范围内计算的,所以this可以在mem-initializer的表达式列表中使用指针来引用正在初始化的对象.]

  • 太疯狂了 :D (2认同)