C ++是否在类构造上构造成员?

时间:2017-04-05 05:49:51

标签: c++ constructor initialization

我有一个结构

struct MyStruct {
    MyStruct( XML cfg ) { ... }
    int m_1, m_2, ... ;
}

和一个班级

class MyBaseClass {
    public:
    MyBaseClass() {}     
    MyStruct m_struct;
}

class MyClass : public MyBaseClass {
    public:
    MyClass( XML cfg ) { m_struct = MyStruct( cfg ); }        
}

现在编译器抱怨MyStruct没有空构造函数

error: no matching function for call to ‘MyStruct::MyStruct()’
 MyClass( XML cfg ) { m_struct = MyStruct( cfg ); }

我不认为继承会发挥作用,但我保持完整性,因为情况可能如此。我从未为MyStruct显式调用空构造函数。类MyClass是否这样做,因为m_struct是它的成员?
如果是这种情况,有没有办法不让它初始化成员,或者这只能用指针作为成员吗?

我知道我可以通过在我的结构中添加一个空构造函数或将构造函数更改为

来解决这个问题。
MyClass( XML cfg ) : m_struct = MyStruct( cfg ) {}

但我很想知道这到底发生了什么。

2 个答案:

答案 0 :(得分:1)

如果省略成员初始值设定项,编译器将使用无参数插入一个。因此错误。

这也意味着在初始化构造函数体内成员的第一个提取中,如果编译器允许,该成员将被初始化两次。不要写这样的代码。

答案 1 :(得分:1)

  

是否在类构造上构造成员?

当然是的。该问题发生在MyBaseClass的构造函数中,该构造函数未明确初始化成员m_struct,然后将默认初始化,但MyStruct没有默认值构造

这不仅适用于数据成员,也适用于基类对象。对于MyClass的构造函数,它没有显式指定基类的构造函数,然后将调用MyBaseClass的默认构造函数,然后导致错误,如上所述。

您可以为MyStruct添加默认构造函数,或在MyBaseClass的构造函数中使用member intializer list,以明确调用MyStruct::MyStruct( XML cfg )以初始化成员m_struct 。 e.g。

MyBaseClass() : m_struct(some_thing) {}