Здравствуйте! У меня возникла проблема при реализации наследования:
template <class T>
class super_array{
protected:
unsigned int size, curFile;// size of sorter; number of last file we usedpublic:
super_array(unsigned int x = 2, string file = "outp"){
sizeOp = x;
out = file;
size = 0;
curFile = 0;
}
~super_array(){
for (int i = 1; i <= curFile; ++ i){
remove(intToStr(i).c_str());
}
}
void push(T& x);
T getNext();
bool empty();
};
template <class T>
class sorter : public super_array<T>{
public:
void push(T& x);
T getNext();
void sorting();
bool empty();
};
template <class T>
class shuffler : public super_array<T>{
public:
void push(T& x);
T getNext();
void shuffling();
bool empty();
};
template<class T>
void sorter<T>::sorting(){
}
Когда я описываю sorting, компилятор ругается, что не описаны переменные size и curFile. А когда вызывается конструктор для sorter не вызывается конструктор super_array, хотя по идее должен. Помогите, пожалуйста, разобраться в чем дело.
Здравствуйте, alexnik, Вы писали:
a> Когда я описываю sorting, компилятор ругается, что не описаны переменные size и curFile.
Надо писать this->curFile или super_array<T>::curFile. Подробнее в этой книге, глава 9. a> А когда вызывается конструктор для sorter не вызывается конструктор super_array, хотя по идее должен.
Не должен.
Здравствуйте, wander, Вы писали:
a>> А когда вызывается конструктор для sorter не вызывается конструктор super_array, хотя по идее должен. W>Не должен.
Здравствуйте, wander, Вы писали:
a>> А когда вызывается конструктор для sorter не вызывается конструктор super_array, хотя по идее должен. W>Не должен.
на самом деле должен (смотри параметры по умолчанию)
но кто-то вводит общественность в заблуждение, не показывая, как проверяет то что не вызывается.
Здравствуйте, Ytz, Вы писали:
Ytz> a>> А когда вызывается конструктор для sorter не вызывается конструктор super_array, хотя по идее должен.
Ytz> W>Не должен.
Ytz> Почему?
Должен — моя ошибка. Там два параметра по умолчанию, а не один (не заметил).
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, wander, Вы писали:
a>>> А когда вызывается конструктор для sorter не вызывается конструктор super_array, хотя по идее должен. W>>Не должен.
NB>на самом деле должен (смотри параметры по умолчанию) NB>но кто-то вводит общественность в заблуждение, не показывая, как проверяет то что не вызывается.
на строчку
sorter<int> s(5, "filename");
компилятор ругается: no matching function for call to ‘sorter<int>::sorter(int, const char [9])’, т.е на сколько я понимаю он пытается вызвать конструктор по умолчанию для sorter
A>компилятор ругается: no matching function for call to ‘sorter<int>::sorter(int, const char [9])’, т.е на сколько я понимаю он пытается вызвать конструктор по умолчанию для sorter
Здравствуйте, alexnik, Вы писали:
NB>>на самом деле должен (смотри параметры по умолчанию) NB>>но кто-то вводит общественность в заблуждение, не показывая, как проверяет то что не вызывается.
A>на строчку
A>sorter<int> s(5, "filename");
A>компилятор ругается: no matching function for call to ‘sorter<int>::sorter(int, const char [9])’, т.е на сколько я понимаю он пытается вызвать конструктор по умолчанию для sorter
конструкторы не наследуются. если тебе у sorter нужен такой же конструктор, что и в базе, напиши это явно.
Здравствуйте, alexnik, Вы писали:
A>Здравствуйте! У меня возникла проблема при реализации наследования: A>
A>template <class T>
A>class super_array{
A> protected:
A> unsigned int size, curFile;// size of sorter; number of last file we used
A> public:
A> super_array(unsigned int x = 2, string file = "outp"){
A> sizeOp = x;
A> out = file;
A> size = 0;
A> curFile = 0;
A> }
A> ~super_array(){
A> for (int i = 1; i <= curFile; ++ i){
A> remove(intToStr(i).c_str());
A> }
A> }
A> void push(T& x);
A> T getNext();
A> bool empty();
A>};
A>template <class T>
A>class sorter : public super_array<T>{
A> public:
A> void push(T& x);
A> T getNext();
A> void sorting();
A> bool empty();
A>};
A>template <class T>
A>class shuffler : public super_array<T>{
A> public:
A> void push(T& x);
A> T getNext();
A> void shuffling();
A> bool empty();
A>};
A>template<class T>
A>void sorter<T>::sorting(){
A>}
A>
A>Когда я описываю sorting, компилятор ругается, что не описаны переменные size и curFile. А когда вызывается конструктор для sorter не вызывается конструктор super_array, хотя по идее должен. Помогите, пожалуйста, разобраться в чем дело.
добавь в производные классы:
using super_array<T>::size;
using super_array<T>::curFile;