我有一个在.h文件中创建的对象,应该在构造函数中初始化。此对象在我们当前的应用程序中传递一个5的COM端口号。出于这个原因,我在.h文件中创建了一个const int。
编辑:我添加了更完整的示例
class ClassB
{
public:
ClassB(int comPort);
private:
int m_comPort;
};
ClassB::ClassB(int comPort) :
m_comPort(comPort)
{
}
class ClassA
{
public:
ClassA();
private:
const int comPort;
ClassB B;
};
ClassA::ClassA() :
comPort(5),
B(comPort)
{
}
int main()
{
ClassA A;
return 0;
}
因为在完全初始化comPort之前初始化了对象,所以comPort的值是垃圾。
绕过这个的正确方法是什么?我能想到以下几点:
答案 0 :(得分:1)
您的成员初始化顺序似乎有问题。类成员按照声明的顺序初始化。它们在构造函数中初始化的顺序不会覆盖它。在下一个示例中,bar::my_foo
在bar::my_const
之前初始化,这将导致问题。 my_foo
将使用已整合的my_const
成员进行初始化;
struct foo {
foo(int p_x) : x(p_x) {}
int x;
}
struct bar {
bar() : my_const(5), my_foo(my_const) {}
foo my_foo;
const int my_const;
}
可以通过更改声明成员的顺序来解决问题。
struct bar {
bar() : my_const(5), my_foo(my_const) {}
const int my_const; // my_const before my_foo
foo my_foo;
}
答案 1 :(得分:0)
如果您在comPort
的定义中交换B
和ClassA
的声明,则可以重现您的错误。请参阅有关Constructor initialization-list evaluation order的SO的评论。
因此,请确保如果初始化列表依赖于特定的评估顺序,则要初始化的成员的声明必须遵守此顺序。