Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用类a中的常量值初始化类B?_C++_Initializer List - Fatal编程技术网

C++ 用类a中的常量值初始化类B?

C++ 用类a中的常量值初始化类B?,c++,initializer-list,C++,Initializer List,如何使用类a中的常量值构造类B,如下所示: class A { public: A( ); private: B b_; const float PARAM_ = 7.7; } class B { B(float param); } A::A() : b_( PARAM_ ) { } 当创建b_而不是预期的7.7时,我在上面的参数中得到了垃圾值。正确的方法是什么?如果适合您的使用,您可以将常量设置为静态。 出现此问题的原因是,在您尝试在b的构造函数中使用参数时,

如何使用类a中的常量值构造类B,如下所示:

class A
{
public:
   A( );
private:
   B b_;
   const float PARAM_ = 7.7;
}

class B
{
    B(float param);
}

A::A() : b_( PARAM_ )
{

}

当创建b_而不是预期的7.7时,我在上面的参数中得到了垃圾值。正确的方法是什么?

如果适合您的使用,您可以将常量设置为静态。 出现此问题的原因是,在您尝试在b的构造函数中使用参数时,参数的非常量版本尚未初始化


作为静态,它将被更早初始化。

< P>问题是C++中非静态成员按声明顺序初始化。code>b_在
PARAM_
之前声明,因此当您在成员初始化列表中写入
b_(PARAM_)
时,
b_
用垃圾值初始化,然后
PARAM_
初始化为7.7。为了避免这种情况,请将
PARAM_
的声明移动到
b_
之前,这是正确的,但您永远不应该(除非没有其他选项)编写依赖于声明顺序的代码。这是非常错误的编程实践。至少这是他们教给我的:)。有效,但我真的不喜欢那个解决方案-(@Danijel如果另一个构造函数不打算将
PARAM
的值设置为不同的值,那么它可能应该是
static
,正如另一个答案所说。将
b
的定义放在
PARAM
的定义之后?