【问题标题】:Default constructor missing for a nested class in the copy constructor of a parent class父类的复制构造函数中的嵌套类缺少默认构造函数
【发布时间】:2014-04-04 20:40:51
【问题描述】:

我有一个嵌套的类结构,A 类是父类,B 类嵌套在下面。 当我编译代码时,A类的复制构造函数报告B类没有默认构造函数。

error: no default constructor exists for class "A::B"

class A{
   -------
   struct B{
     B(var1, var2){}
   };
   B b;
};

A::A(){ b = new B(Var1, Var2) } // default constructor
A::A(a){ } // copy constructor

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 您在哪里有B 的实例?只有复制构造函数会出错吗?
  • 向我们展示我们可以实际使用和编译以获得与您所遇到的相同行为的代码。
  • 您实际在哪里使用B
  • 等等,你的意思是b实际上是一个指针?您确实需要发布实际代码。

标签: c++ class


【解决方案1】:

您需要在两个构造函数中使用成员初始化器:

A::A() : b(Var1, Var2) {}
A::A(const A& a) : b(Var1, Var2) {}

【讨论】:

    【解决方案2】:

    您定义了一个带有两个参数B(var1, var2) 的构造函数,因为不会自动为您提供默认构造函数。

    所以你有几个选择。

    选择 1

    struct B 定义中为b 添加默认构造函数

    struct B{
        ....
        B() {};
    }
    

    你下面的语法也应该是错误的:

    A::A() : b() {};
    A::A( const A& a) : b() {};
    

    选择 2

    您可以使用 B 的非默认构造函数,但您必须从某个地方提出值

    A::A() : B( valA, valB ) {};
    A::A( const A& a) : b(valA, valB) {};
    

    选择 3

    您可能不希望这样做,而是应该为 B 创建一个复制构造函数并执行此操作

    A::A( const A& a) : b(a.b) {};
    

    【讨论】:

    • A 不是从B 派生的,但A 确实有一个名为b 的成员,其类型为B,因此A 构造函数中的初始化列表需要使用b() 而不是B()
    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多