Наследование с шаблонами.
От: alexnik  
Дата: 09.12.11 04:24
Оценка:
Здравствуйте! У меня возникла проблема при реализации наследования:
template <class T>
class super_array{
    protected:
        unsigned int size, curFile;// size of sorter; number of last file we used
    public:
        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, хотя по идее должен. Помогите, пожалуйста, разобраться в чем дело.
ооп
Re: Наследование с шаблонами.
От: wander  
Дата: 09.12.11 05:17
Оценка: -1
Здравствуйте, alexnik, Вы писали:

a> Когда я описываю sorting, компилятор ругается, что не описаны переменные size и curFile.

Надо писать this->curFile или super_array<T>::curFile. Подробнее в этой книге, глава 9.
a> А когда вызывается конструктор для sorter не вызывается конструктор super_array, хотя по идее должен.
Не должен.
avalon 1.0rc3 build 426, zlib 1.2.3
Re[2]: Наследование с шаблонами.
От: Ytz https://github.com/mtrempoltsev
Дата: 09.12.11 05:28
Оценка: +1
Здравствуйте, wander, Вы писали:

a>> А когда вызывается конструктор для sorter не вызывается конструктор super_array, хотя по идее должен.

W>Не должен.

Почему?
Re[2]: Наследование с шаблонами.
От: night beast СССР  
Дата: 09.12.11 05:32
Оценка: +2
Здравствуйте, wander, Вы писали:

a>> А когда вызывается конструктор для sorter не вызывается конструктор super_array, хотя по идее должен.

W>Не должен.

на самом деле должен (смотри параметры по умолчанию)
но кто-то вводит общественность в заблуждение, не показывая, как проверяет то что не вызывается.
Re[3]: Наследование с шаблонами.
От: wander  
Дата: 09.12.11 05:41
Оценка: 1 (1)
Здравствуйте, Ytz, Вы писали:

Ytz> a>> А когда вызывается конструктор для sorter не вызывается конструктор super_array, хотя по идее должен.


Ytz> W>Не должен.


Ytz> Почему?


Должен — моя ошибка. Там два параметра по умолчанию, а не один (не заметил).
avalon 1.0rc3 build 426, zlib 1.2.3
Re[3]: Наследование с шаблонами.
От: alexnik  
Дата: 09.12.11 08:37
Оценка:
Здравствуйте, 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
Re[4]: Наследование с шаблонами.
От: Ytz https://github.com/mtrempoltsev
Дата: 09.12.11 08:46
Оценка:
Здравствуйте, alexnik, Вы писали:

A>на строчку

A>
A>sorter<int> s(5, "filename"); 
A>

A>компилятор ругается: no matching function for call to ‘sorter<int>::sorter(int, const char [9])’, т.е на сколько я понимаю он пытается вызвать конструктор по умолчанию для sorter

Конструктор напиши соответствующий.
Re[4]: Наследование с шаблонами.
От: night beast СССР  
Дата: 09.12.11 08:50
Оценка:
Здравствуйте, 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 нужен такой же конструктор, что и в базе, напиши это явно.
sorter (unsigned int x, string file) : super_array( x,file ) {}
Re: Наследование с шаблонами.
От: zakharov75 Великобритания  
Дата: 09.12.11 10:56
Оценка:
Здравствуйте, 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;

или при обращении к используй:
super_array<T>::size
super_array<T>::curFile

или
this->size
this->curFile
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.