2015-03-14 4 views
0

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

В файле BaseFile.h

class Base{ 
private: 
int a, b; 
protected: 
//some data members and functions that I want to share with derived class 
public: 
Base(int apple, int ball):apple(a), ball(b) {} 
}; 

В файле DerivedFile.h

#include "BaseFile.h" 
class Derived : public Base{ //error in this line 
//stuffs 
}; 

Всякий раз, когда я объявляю производный класс, я получите сообщение об ошибке «Отсутствие подходящей функции для вызова Base :: Base note :: кандидат ожидает 2 аргумента 0 предоставлено». Что может быть причиной этой проблемы?

+0

Как Derived знать, как вызвать базовый конструктор? –

+0

Прошу прощения, я не мог получить то, что вы просите. Я назвал оба их конструктора отдельно в третьем файле. – user3124361

+0

Вам нужно показать свой «третий файл» –

ответ

2

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

3

Во-первых, ваш список инициализаторов в базовом классе неверен. Должно быть a(apple), b(ball).

Во-вторых, вам нужно инициализировать базовый класс в классе Derived, т. Е. Вызвать его конструктор. Что-то вроде

Derived::Derived() : 
    Base(0,0) { 
} 
0

Вы получаете эту ошибку, потому что Base класс не имеет конструктора по умолчанию (который принимает 0 аргументов) и из полученного конструктора класса конструктор базового класса по умолчанию становится называется. Это может быть исправлено двумя способами: конструктор

  1. Добавить по умолчанию базового класса
  2. Убедитесь, что конструктор класса Base всегда называется Base(int, int).

Также есть опечатка в базовый класс кода конструктора

Base(int apple, int ball):apple(a), ball(b) {} 

Это должно быть

Base(int apple, int ball):a(apple), b(ball) {}