C++类构造上构造成员

C++ does a class construct members on class construction?

本文关键字:成员 构造上 C++      更新时间:2023-10-16

我确实有一个结构体

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 的构造函数中使用成员初始化器列表,以显式调用MyStruct::MyStruct( XML cfg )来初始化成员m_struct

MyBaseClass() : m_struct(some_thing) {}

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

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