2015-05-07 234 views
2

我不想使用默认的构造函数,因此我执行排雷没有默认构造函数发现

class A 
{ 
    public: 
    A(int&i); 
    A& operator=(const A& a); 
    A(const A&a); 
}; 

但在B类

class B 
{ 
    A a; 
    public: 
    B(const A&a){this->a=a;} 
} 

然后错误:

no appropriate default constructor of A found.

+1

http://stackoverflow.com/help/mcve –

+1

提供的代码[作品](http://ideone.com/P080CF)。也许你需要详细说明一下 – Diego

+0

很难确定你在问什么。你提供的代码可以工作,所以我假设有一个地方需要'A'的默认构造函数。该错误应该带你到需要它的线路。在说:通过定义任何的构造函数,编译器不会自动为你生成一个默认的构造函数,所以它听起来像你有你想要什么,你只需要找出其中你的代码试图默认构造'A' – Tas

回答

3

使用构造函数初始化列表,以便通过复制构造函数初始化成员a

B(const A&a):a(a){} 

如果不使用构造函数初始化列表,则编译器将首先尝试初始化A a;,只有经过指定的其他a它。但是,第一次初始化失败,因为没有提供默认的构造函数。通常,建议初始化成员时始终使用构造函数初始化列表。通过这种方式,您不必调用一个构造函数+一个赋值运算符,而只需调用复制构造函数。

我建议将会员的姓名从a更改为例如_a,所以代码变得更加清晰。

+0

:-D是的,就是这样。 – user1453256

相关问题