在初始化列表中使用此指针

Using this pointer in an initialization list

我目前正在尝试了解我是否可以在初始化中使用 this 指针 list.I 读取 this SO post 说明

Yes. It's safe to use this pointer in initialization-list as long as it's not being used to access uninitialized members or virtual functions, directly or indirectly, as the object is not yet fully constructed. The object child can store the this pointer of Parent for later use!

所以我决定使用以下代码尝试一下

struct base
{
    int bse;
    base() {
        std::cout << "Base constructor called \n";
    }
};
struct foo
{

    foo() {
        std::cout << "Foo constructor \n";
    }

    foo(int a) {
        std::cout << "Foo parameter \n";
    }
};

struct test : public base
{
    foo a;
    test(int _a) : this->bse(24) , a(_a) {
        std::cout << "test constructor";
    }
};

现在,从上面的示例中,基础 class 构造函数已完全构建,但是基础 class 仍未完全构建 constructed.In 我正在尝试调用继承成员变量的初始化列表已经完全 constructed.As 我已经 posted link 提到在初始化列表中使用这个 pointer 是安全的,只要被引用的对象是完全constructed.Please 如果我误解了引述,请纠正我。所以我的问题是我为什么会收到错误

main.cpp: In constructor 'test::test(int)':
main.cpp:27:20: error: class 'test' does not have any field named 'bse'
     test(int _a) : bse(24) , a(_a) {
test(int _a) : this->bse(24) , a(_a) { ... }

无效,因为在初始化列表中只能初始化成员变量和基 classes。 base classes 的成员不能在那里初始化。

您必须初始化 and/or 使用其他方式设置基 class 的 bse 成员的值。

  1. 在基数 class 中提供一个接受 int 的构造函数。然后,您可以使用:

    test(int _a) : base(24) , a(_a) { ... }
    
  2. test()的正文中设置值。

    test(int _a) : a(_a) { bse = 24; ... }