避免调用成员变量的构造函数

Atm*_*ons 11 c++ initializer-list

我有以下C++ - 类:

// Header-File
class A
{
    public:
    A();

    private:
    B m_B;
    C m_C;
};

// cpp-File
A::A()
: m_B(1)
{
    m_B.doSomething();
    m_B.doMore();
    m_C = C(m_B.getSomeValue());
}
Run Code Online (Sandbox Code Playgroud)

我现在想避免class A调用任何的构造函数C m_C.因为在最后一行A::A(),我总是要m_C自己初始化,因为我需要先做好准备m_B.我可以提供一个空的默认构造函数class B.但那不是主意.

我已经尝试添加m_C(NULL)到init-list中A::A().有时它有效,有时它说没有构造函数NULL作为参数.

那我怎么能没有m_C初始化?我知道,通过指针,m_C(NULL)-way可行.我不想动态分配它new.

任何想法都表示赞赏.

Eon*_*nil 5

如何使用此质量检查中介绍的技术?

防止调用类内部数组的默认构造函数

std::aligned_storage<sizeof(T[n]), alignof(T)>::type
Run Code Online (Sandbox Code Playgroud)

或者,您也可以考虑使用union。AFAIK,联合将仅使用第一个命名成员的构造函数进行初始化。

例如,

union
{
   uint8_t _nothing = 0; 
   C c;
};
Run Code Online (Sandbox Code Playgroud)

根据质量检查中提到的标准,c将被初始化为零,并且不会调用其构造函数。


Tob*_*ner 2

你问的问题是被禁止的——而且是正确的。这确保了每个成员都被正确初始化。不要试图解决它 - 尝试构建他们可以使用它的类。

主意:

  • C 有一个不执行任何操作的构造函数
  • C 有一个使类可用的初始化方法
  • C 跟踪它是否已正确初始化,如果在未初始化的情况下使用,则返回适当的错误。

  • 嗯...我部分不同意。在构造函数中,我也确保每个成员都正确初始化。如果您有一个指针,它也没有“正确”初始化。但看来我得采取另一条路了。谢谢你! (2认同)