Используйте список инициализации конструктора, поэтому член a
инициализируется с помощью конструктора копирования:
B(const A&a):a(a){}
Если вы не используете список инициализации конструктора, то компилятор сначала пытается инициализировать A a;
, и только после того, присваивает другой a
к нему. Однако первая инициализация завершилась неудачей, потому что не существует конструктора по умолчанию. В общем случае рекомендуется всегда использовать список инициализации конструктора при инициализации членов. Таким образом, вместо вызова одного конструктора + одного оператора присваивания вы вызываете только конструктор копирования.
Предлагаю изменить название элемента от a
, например. _a
, поэтому код становится более понятным.
http://stackoverflow.com/help/mcve –
предоставленный код [работает] (http://ideone.com/P080CF). может быть, вам нужно немного доработать – Diego
Трудно быть уверенным, что вы просите. Код, который вы предоставляете, работает, поэтому я предполагаю, что есть где-то, для которого требуется конструктор по умолчанию для 'A'. Ошибка приведет вас к требуемой строке. Говоря о том, что: определяя любой конструктор, компилятор не будет автоматически генерировать конструктор по умолчанию для вас, поэтому кажется, что у вас есть то, что вы хотите, вам просто нужно выяснить, где ваш код пытается построить по умолчанию 'A' – Tas