【问题标题】:C++ does a class construct members on class construction?C++ 类在类构造上构造成员吗?
【发布时间】:2017-04-05 05:49:50
【问题描述】:

我确实有一个结构

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

我不认为继承在 ehre 中起作用,但我保留它是为了完整性,因为它可能是这种情况。我从不为 MyStruct 显式调用空构造函数。 MyClass 类这样做是因为 m_struct 是它的成员吗?
如果是这种情况,有没有办法让它不初始化成员,或者只有指针作为成员才有可能?

我知道我可以通过在我的结构中添加一个空的构造函数或将构造函数更改为来解决这个问题

MyClass( XML cfg ) : m_struct = MyStruct( cfg ) {}

但我很想知道这里到底发生了什么。

【问题讨论】:

  • structclass 是相同的。它们在这里没有形成有用的类别。
  • 我使用一个结构,因为它只包含几个公共成员。该类本身包含的内容比我的示例要多得多,我只是尝试在我的示例中保持简约
  • 继承在这里确实不起作用。完全可以去掉MyClass,实例化MyBaseClass,问题一模一样。
  • @chrise 是的,我想我误读了这个问题。但如果你想要简约,你可以使用struct 来处理一切。它涉及更少的打字(你不必到处说public
  • 你可以在这里找到一个很好的答案:stackoverflow.com/questions/926752/…

标签: c++ constructor initialization


【解决方案1】:

一个类在类构造上构造成员吗?

当然可以。问题出现在MyBaseClass的构造函数上,它没有显式初始化成员m_struct,然后会默认初始化,但是MyStruct没有默认构造函数。

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

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

MyBaseClass() : m_struct(some_thing) {}

【讨论】:

  • 谢谢。我没有意识到这一点。我碰巧使用智能指针作为实例本身的成员,所以在我修补 c++ 的几周中,我实际上从未偶然发现过这个问题
  • @chrise 智能指针可以默认构造;所以一切都很好。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 2017-04-06
    • 1970-01-01
    • 2011-12-07
    • 2017-02-10
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多