C++在类构造上做了一个类构造成员?
我有一个结构C++在类构造上做了一个类构造成员?
struct MyStruct {
MyStruct(XML cfg) { ... }
int m_1, m_2, ... ;
}
和A类
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); }
我不认为德继承戏剧一个角色ehre,但我保持它的完整性,因为它可能是这样。我从来没有显式调用MyStruct的空构造函数。类MyClass是否这样做是因为m_struct是它的成员?
如果是这种情况,有没有办法没有它初始化成员或只有指针作为成员才有可能?
我知道我可以只需添加一个空的构造我的结构或改变构造函数
MyClass(XML cfg) : m_struct = MyStruct(cfg) {}
解决这个问题,但我很好奇,想知道究竟是怎么回事。
在类构造上做类构造成员吗?
当然是的。这个问题发生在MyBaseClass
的构造函数中,它不会显式地初始化成员m_struct
,那么它将被默认初始化,但MyStruct
没有默认构造函数。
这不仅适用于数据成员,也适用于基类对象。对于MyClass
的构造函数,它没有明确指定基类的构造函数,则会调用MyBaseClass
的默认构造函数,然后如上所述引发错误。
您可以添加一个默认的构造函数为MyStruct
,或使用member intializer list在MyBaseClass
构造函数,调用MyStruct::MyStruct(XML cfg)
明确并初始化成员m_struct
。例如
MyBaseClass() : m_struct(some_thing) {}
谢谢,我没有意识到这一点。我碰巧使用智能指针作为实例本身的成员,所以在我用C++修补的几周内,我从未偶然发现过这个问题 – chrise
@chrise智能指针可以默认构造;所以一切都很好。 – songyuanyao
如果您省略成员初始值设定项,编译器将插入一个不使用参数。因此错误。
这也意味着,如果编译器允许,那么在您初始化构造函数体内的成员的第一个提取中,成员会初始化两次。不要这样写代码。
'struct'和'class'是一样的。它们在这里不构成有用的类别。 – juanchopanza
我使用一个结构体,因为它只包含几个公共成员。这个类本身包含了比我的例子更多的东西,我只是试图在我的示例中成为minimalsitic – chrise
继承在这里确实没有任何作用。你可以完全删除MyClass,实例化MyBaseClass,并有完全相同的问题。 – WhozCraig