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

时间:2017-05-19 06:16:36

标签: c++ this initialization-list

我目前正在尝试了解是否可以在初始化列表中使用this指针。我读了this SO帖子中的哪些状态

  

是。只要在初始化列表中使用此指针是安全的   它不被用于访问未初始化的成员或虚拟成员   函数,直接或间接,因为对象尚未完全   建造。对象子可以存储Parent的this指针   以后用!

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

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";
    }
};

现在从上面的例子中完全构造了基类构造函数,但基类仍未完全构造。在初始化列表中,我试图调用已完全构造的继承成员变量。作为我已经的链接发布提到在初始化列表中使用此pointer是安全的,只要被引用的对象是完全构造的。如果我误解了引用,请纠正我。所以我的问题是在我的情况下为什么我得到错误

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

1 个答案:

答案 0 :(得分:3)

test(int _a) : this->bse(24) , a(_a) { ... }

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

您必须使用其他方式初始化和/或设置基类的bse成员的值。

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

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

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