2013-05-09 4 views
0

Я пытаюсь написать относительно глубокую иерархию классов, и мой компилятор продолжает бросать «не соответствующую функцию для вызова [конструктор по умолчанию для бас-класса]». Вот сценарий:Список инициализации C++ во втором классе derrive

Class A { 
    A(int);//note, no default constructor 
} 

Class B : public A { 
    B(int i, int j) : A(i), someMemberVariable(j) {} 
    int someMemberVariable; 
} 

Class C : public B { 
    C(int k, int l) : B(k, l) {} 
} 

и компилятор бросает ошибку на линии конструктора класса С не говоря «нет подходящей функции для вызова A :: A()» и говорит мне, чтобы использовать A :: A (INT).

Я понимаю, что у меня нет конструктора по умолчанию для класса A, и компилятор запутывается при попытке подкласса подкласса. Однако я не понимаю, почему. Я использовал список инициализации, чтобы избежать этого. Если я использую только 2-уровневые классы, то он работает нормально, но третий класс дает мне ошибку. Что я здесь делаю неправильно?

+3

Вы должны подготовить ['SSCCE'] (http://sscce.org). Трудно поверить, что приведенный выше код является репрезентативным для вашей проблемы, поскольку вы не копировали-вставляете то из любого реального кода ('Class' не является ключевым словом, точки с запятой отсутствуют и т. Д.) –

+4

конструкторы должны быть общедоступными; и после исправления класса все компилируется на VS2008. – Max

+0

Похоже, он отлично работает здесь: https://ideone.com/CxoszY. «мой компилятор продолжает метать». Возможно, вы хотели бы поделиться, какой компилятор вы используете? – Bill

ответ

3

Как прокомментировал люди просто нужно сделать Конструкторы общественности, а затем ваш код имел некоторые проблемы форматирования:

class A 
{ 
    public: 
    A(int a) : blah(a) {}; //note, no default constructor 
    int blah; 
}; 

class B : public A 
{ 
    public: 
    B(int i, int j) : A(i), someMemberVariable(j) {} 
    int someMemberVariable; 
}; 

class C : public B 
{ 
    public: 
    C(int k, int l) : B(k, l) {} 
}; 

int main(void) 
{ 
    C c(5,4); 
    return 0; 
} 

Этот код компилируется и делает то, что вы хотите.

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