我有一个结构

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 ) {}

但我很好奇这到底是怎么回事。

最佳答案



当然可以问题发生在MyBaseClass的构造函数中,该构造函数没有显式初始化成员m_struct,然后将默认初始化,但MyStruct没有默认的构造函数。

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

您可以为MyStruct添加默认构造函数,或在MyBaseClass的构造函数中使用member intializer list显式调用MyStruct::MyStruct( XML cfg )来初始化成员m_struct。例如

MyBaseClass() : m_struct(some_thing) {}

关于c++ - C++类在类构造上构造成员吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43222810/

10-11 23:06
查看更多