C++类构造上构造成员
C++ does a class construct members on class construction?
我确实有一个结构体
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) {}
如果省略成员初始值设定项,编译器将使用不使用参数插入一个初始值设定项。因此错误。
这也意味着,在初始化构造函数体内成员的第一个数据提取中,如果编译器允许,该成员将初始化两次。不要这样写代码。
相关文章:
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- 在成员构造函数之后调用基类构造函数
- CPPCHECK C++成员函数上的格式字符串
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 如何在多个成员阵列上构建合并视图
- C++:如何在对象构造过程中调用初始值设定项列表之外的成员构造函数
- 用作成员构造函数参数的函数的求值顺序
- [[maybe_unused]] 在成员变量上,GCC 警告(不正确?)该属性被忽略
- 应该在成员对象上调用析构函数
- C++排序向量<double>与在<Object>双成员变量上键控的向量
- 在构造函数中从另一个类成员构造一个类成员
- 在模板成员函数上是台外Sfinae
- 从成员构造函数(Brace Initializer vs Initializer列表)抛出异常
- 不正确的成员构造函数定义
- C++类构造上构造成员
- (C++)(链接错误)模板成员函数上未解析的外部
- 在成员变量上执行std :: upper_bound的任何方法
- Winapi:在类成员功能上创建新线程 - 不兼容的参数类型
- std :: async在成员字段的成员功能上
- Equals运算符在构造函数中具有引用的成员类型上不可用