2015-05-07 8 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

Смежные вопросы