【问题标题】:Initialise const int and object with that const int in the same constructor在同一个构造函数中用该 const int 初始化 const int 和对象
【发布时间】:2017-01-16 15:39:35
【问题描述】:

我有一个在 .h 文件中创建的对象,应该在构造函数中初始化。这个对象被传递了一个 COM 端口号,在我们当前的应用程序中是 5。为此,我在 .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 的值是垃圾。

规避此问题的正确方法是什么?我可以想到以下几点:

  • 初始化头文件中的const int
  • 在构造函数体中创建并初始化对象
  • 使用#define

【问题讨论】:

  • 如果在B 之前的类中定义了comPort,那么它就不是垃圾。这里没有足够的信息来回答您的问题或重现问题。
  • 我会编辑一个更完整的例子,抱歉!
  • 我看不出你是如何在这里得到垃圾的。代码看起来正确。
  • 它应该仍然可以正常工作。是 m_comPort 你看到的问题吗?
  • @YouKnowNothingJohn 你确定在B 之前在classA 中声明comPort

标签: c++ c++11 initialization initializer-list


【解决方案1】:

您的成员初始化顺序似乎有问题。 按照声明的顺序对类成员进行初始化。它们在构造函数中初始化的顺序不会覆盖它。在下一个示例中,bar::my_foobar::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) {} 摆脱了任何依赖。
【解决方案2】:

如果您在ClassA 的定义中交换comPortB 的声明,您可以重现您的错误。请参阅关于 Constructor initialization-list evaluation order 的 SO 评论。

因此,请确保如果初始化列表依赖于特定的求值顺序,则要初始化的成员的声明必须遵守此顺序。

【讨论】:

  • 正如弗朗索瓦在 cmets 中提到的,我相信这是罪魁祸首!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多