【问题标题】:constructor of the class containing another class as member variables包含另一个类作为成员变量的类的构造函数
【发布时间】:2013-02-25 02:26:01
【问题描述】:

我正在尝试创建一个包含另一个类作为成员变量的类。我遇到了以下问题:

class SubClass{
    ....
};

class MainClass{
   public:
    MainClass(SubClass const & subClass_);
   private:
    SubClass subClass
};

在构造函数的 .cpp 文件中

MainClass::MainClass(SubClass const & subClass_){
   subClass =  subClass_;
}

这会给出编译器错误。但以下工作:

MainClass::MainClass(SubClass const & subClass_):
   subClass(subClass_) {}

谁能告诉我这两个有什么区别?

【问题讨论】:

  • 一种是构造后赋值,一种是复制构造。 SubClass 的声明是理解为什么编译和为什么不编译的关键。
  • 请在SubClass的声明中填写....的内容。
  • This one,有人吗?有一个大标题,标题为Initializing 和Assignment inside constructor有什么区别?
  • 什么是编译器错误?
  • @Nate,我怀疑没有匹配的复制赋值运算符或没有默认构造函数。

标签: c++ oop class constructor


【解决方案1】:

这很可能表明 SubClass 不支持赋值运算符(这在您以前的代码中是必需的)。后面的代码不调用赋值,而是从 subClass_ 复制初始化子类成员

一旦你把子类的定义放进去,就可以说更多了

【讨论】:

  • 这不是唯一的可能性。如果SubClass的默认构造函数不能被调用,也会编译失败。
【解决方案2】:

您不能通过简单地使用 '=' 来复制对象,除非该操作符被“重载”以某种方式克隆对象。不过,这里的 subClass 有一个构造函数,可以将输入对象复制到新的对象中,这就是您可以使用第二个代码的原因。

【讨论】:

    【解决方案3】:
    • 在第一种情况中使用operator=,它被应用于已创建的类实例 (创建类的第一个默认实例,然后调用 operator=)
    • 在第二种情况下使用成员初始化允许使用复制构造函数来创建类实例,因此最初使用所需的值对其进行初始化。

    区别:
    第二种情况被认为更有效,因为它执行的操作更少。
    第一种情况 - 要求类具有默认构造函数。

    您的问题很可能是没有实现 MainClass 的默认构造函数,只要您实现了自己版本的构造函数 - 编译器不再创建特殊的成员函数(默认构造函数)

    解决方案:实现默认构造函数/使用成员初始化语法(根据您应用程序的逻辑选择变体)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 2018-09-28
      • 2023-03-03
      • 2013-06-18
      相关资源
      最近更新 更多