2012-01-16 5 views
-1

Когда конструктор в суперклассе принимает аргументы, он больше не является конструктором по умолчанию, правильно? НапримерC++, конструктор по умолчанию

class a { 
    public: 
     int a; 
     int b; 
     a(int c, int d){ 
     cout<<"hello"; 
     }; 
} 

Теперь, когда я пытаюсь сделать подкласс, программа вызывает ошибку, он говорит: «конструктор по умолчанию не определен в родительском классе». Как я могу решить эту проблему? Я знаю, что если я удалю аргументы, все будет хорошо, но мне говорят не делать этого в своем тесте на C++. Пожалуйста, помогите мне разобраться.

+0

Это связанно: http://stackoverflow.com/questions/5577663/about-base-class-in-derived-class -initialization –

ответ

2

Вы обычно имеют дело с этим со списком инициализатора:

#include <iostream> 

class a { 
public: 
    a(int c, int d) { std::cout << c << " " << d << "\n"; } 
}; 

class b : public a { 
public: 
    b() : a(1, 2) {} 
}; 

int main() { 
    b x; 
    return 0; 
} 
+0

Мне не разрешено изменять кодировку, я просто добавляю дополнительные подкласс для этого суперкласса. –

+0

Это не связано с модификацией базового класса, только производного класса (ов). Я включил определение базового класса выше только для полноты, но (например) приведенный здесь 'b' должен работать с' a', определенным вами в вашем вопросе. –

+0

Я попробовал, но визуальная студия подчеркнула всю строку b(): a (1, 2) {}, –

2

Вы должны предоставить конструктор, который не принимает никаких аргументов самостоятельно.

a::a() 
{ 

} 

После того как вы предоставили конструктор для своего класса, компилятор не создает неявный конструктор по умолчанию, который не принимает аргументов. Поэтому, если вашему коду не нужен конструктор без аргументов, вам придется предоставить его самостоятельно.

+0

Я только что попробовал, но он дал мне ту же ошибку + новую из a :: a() {}. Есть идеи? –

+0

Пожалуйста, разместите свой код в Question.Unless. Вы покажете, что вы пробовали, как вам помочь? –

+0

Мне дается код, мне не разрешено его изменять. Я прошу сделать это, чтобы добавить два подкласса на основе данного суперкласса, класс выглядит примерно так: class a { public: \t int x; \t строка h; \t a (int y, string d) { \t \t y = 10; \t d = "hello"; \t cout << y << endl << d; \t}; }; –

3

Если базовый класс не по умолчанию, конструктивны, или если вы не хотите использовать конструктор по умолчанию базового класса, то вы просто должны сказать производного класса, как построить базу субобъекта:

struct b : a 
{ 
    b(int n) : a(n, 2*n) { } 
    //   ^^^^^^^^^ <-- base class initializer, calls desired constructor 
}; 
Смежные вопросы