在同一构造函数中初始化const int和具有该const int的对象
我有一个应该在构造函数中初始化的.h文件中创建的对象。该对象通过当前应用程序中5的COM端口号。为此,我在.h文件中创建了一个const int。在同一构造函数中初始化const int和具有该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之前被初始化对象被完全初始化,为相称的值是垃圾。
避免这种情况的正确方法是什么?我能想到以下几点:
- 初始化的const int的头文件
- 创建和初始化对象的构造
- 的身体使用的#define
你可以如果您在ClassA
的定义中交换comPort
和B
的声明,则重现您的错误。请参阅有关Constructor initialization-list evaluation order的此评论。
因此,请确保如果初始化程序列表依赖于特定的评估顺序,则要初始化的成员声明必须遵守此顺序。
弗朗索瓦在评论中提到,我相信这是罪魁祸首! – YouKnowNothingJohn
这似乎是您的成员初始化的顺序问题。班级成员按的顺序初始化为。它们在构造函数中初始化的顺序不会覆盖它。在下一个示例中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;
}
不太脆弱的做法是不依赖订单。 'bar(const int var = 5):my_const(var),my_foo(var){}'摆脱了任何依赖。 – NathanOliver
如果'comPort'是在'B'之前的类中定义的,那么它不会是垃圾。没有足够的信息来回答您的问题或重现问题。 – wally
我会编一个更完整的例子,道歉! – YouKnowNothingJohn
添加了更详细的代码示例。 – YouKnowNothingJohn