父类的复制构造函数中的嵌套类缺少默认构造函数

Posted

技术标签:

【中文标题】父类的复制构造函数中的嵌套类缺少默认构造函数【英文标题】: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 How do you use the non-default constructor for a member? 的可能重复项 等等,你的意思是b实际上是一个指针?您确实需要发布实际代码。 【参考方案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()

以上是关于父类的复制构造函数中的嵌套类缺少默认构造函数的主要内容,如果未能解决你的问题,请参考以下文章

扩展1

子父类中的构造函数

子类为啥要调用父类的构造函数

子类都会首先调用父类的构造函数吗?

复制构造函数中的c ++用户定义成员

java子类构造中怎么调用父类的构造函数