![](/img/trans.png)
[英]Can member variables be used to initialize other members in an initialization list?
[英]Initialization Lists - Can I initialize members with other members of the same class?
出于RAII的考虑,我希望将类成员保留为值对象,但是我也想将指向其他对象的指针传递到其构造函数中,以确保立即对其进行初始化。
我正在使用构造函数初始化列表对其进行初始化,但是我不确定是否可以使用指向其他类成员的指针来初始化类成员。
以下代码可以使用Apple LLVM 5.1编译器在XCode中按我的预期进行编译和运行,但是我可以对所有编译器使用并信任此定义的行为吗? 而且,这是一般的好习惯还是应该避免的事情? 除了init()
函数之外,还有其他方法可以实现此目的吗?
class Foo {
public:
int value;
Foo() {}
void woot() {
std::cout << "A Foo says WOOT my value is: " << value << std::endl;
}
};
class Bar {
public:
Foo* foo;
int value;
Bar( Foo* f ) : foo(f) {
foo->value = 66;
foo->woot();
}
void woot() {
std::cout << "A Bar says WOOT my value is: " << value << std::endl;
}
};
class Boo {
public:
Foo* foo;
Bar* bar;
int value;
// Passing members into constructors of other members:
Boo( Foo* f, Bar* b ) : foo(f), bar(b) {
foo->value = 77;
foo->woot();
bar->value = 88;
bar->woot();
}
};
class Yaa {
public:
Foo foo;
Bar bar;
Boo boo;
Yaa() : bar(&foo), boo(&foo, &bar) {
woot();
}
void woot() {
std::cout << "A Yaa says WOOT, my children say woot:" << std::endl;
foo.woot();
bar.woot();
}
};
void testInitialisation() {
Yaa f;
}
// ...
testInitialisation();
// Output:
// A Foo says WOOT my value is: 66
// A Foo says WOOT my value is: 77
// A Bar says WOOT my value is: 88
// A Yaa says WOOT, my children say woot:
// A Foo says WOOT my value is: 77
// A Bar says WOOT my value is: 88
编辑/注意:接受@Wes Hardaker的回答后,我听取了他的建议,并对初始化顺序进行了更多阅读。 我相信我最初的困惑是在阅读《 The C ++ Primer》(Lippman,Lajoie和Moo)中的“最佳实践”注释后发生的:
...如果可能,请避免使用成员初始化其他成员。
后来,我想到这个想法是错误的,但是再次阅读本章后,我意识到这是完全合法的,尽管应谨慎使用。 这本书实际上是在警告使用成员初始化其他成员时的潜在危险。 初始化的顺序取决于在类中声明成员的顺序,而不是由它们在初始化列表中的顺序决定 。 这意味着,如果您将订单向后退,则可以将未定义的成员传递给另一个成员。
因此,如果您谨慎的话就可以了,但是我想它稍后可能会再次咬住您(或其他使用您代码的人)。
是的,这是合法的,并且已在许多地方使用。 如果您查看C ++参考文本,将会发现它涉及初始化顺序,在此您可以放心自己是真的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.