2017-04-05 54 views
1

我有一个结构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) {} 

解决这个问题,但我很好奇,想知道究竟是怎么回事。

+0

'struct'和'class'是一样的。它们在这里不构成有用的类别。 – juanchopanza

+0

我使用一个结构体,因为它只包含几个公共成员。这个类本身包含了比我的例子更多的东西,我只是试图在我的示例中成为minimalsitic – chrise

+0

继承在这里确实没有任何作用。你可以完全删除MyClass,实例化MyBaseClass,并有完全相同的问题。 – WhozCraig

回答

1

在类构造上做类构造成员吗?

当然是的。这个问题发生在MyBaseClass的构造函数中,它不会显式地初始化成员m_struct,那么它将被默认初始化,但MyStruct没有默认构造函数。

这不仅适用于数据成员,也适用于基类对象。对于MyClass的构造函数,它没有明确指定基类的构造函数,则会调用MyBaseClass的默认构造函数,然后如上所述引发错误。

您可以添加一个默认的构造函数为MyStruct,或使用member intializer listMyBaseClass构造函数,调用MyStruct::MyStruct(XML cfg)明确并初始化成员m_struct。例如

MyBaseClass() : m_struct(some_thing) {} 
+0

谢谢,我没有意识到这一点。我碰巧使用智能指针作为实例本身的成员,所以在我用C++修补的几周内,我从未偶然发现过这个问题 – chrise

+0

@chrise智能指针可以默认构造;所以一切都很好。 – songyuanyao

1

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

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