我目前正在尝试了解是否可以在初始化列表中使用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) {
答案 0 :(得分:3)
test(int _a) : this->bse(24) , a(_a) { ... }
无效,因为只能在初始化列表中初始化成员变量和基类。基类的成员无法在那里初始化。
您必须使用其他方式初始化和/或设置基类的bse
成员的值。
在基类中提供一个int
的构造函数。然后,您可以使用:
test(int _a) : base(24) , a(_a) { ... }
在test()
的正文中设置值。
test(int _a) : a(_a) { bse = 24; ... }