наследование — список инициализации C ++ во втором классе

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

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) {}
}

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

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

0

Решение

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

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;
}

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]