C ++ - Наследование с уже шаблонным классом? - PullRequest
1 голос
/ 21 января 2012

Так что я был немного испорчен Java / C # и почти (очевидно) забыл, как программировать на C ++.

У меня есть шаблонный список с двумя связями ("Dlist"), которыйЯ создалОн выложен в заголовочном файле (бог, заголовочные файлы странные ) и реализован в CPP.

Итак, если я помню, какой маленький C ++ я знаю правильно, fn в этомCPP выглядит примерно так:

//ctor
template <typename T>
Dlist<T>::Dlist()
{
    first = NULL;
    last = NULL;
    return;
}//end fn

Я хочу создать пару подклассов для этого списка.В новом CPP, называемом, скажем, «stack.cpp», у меня есть:

#include "dlist.h"

template <typename T>
class Stack : public Dlist<T>
{
  public:
     //template <typename T>
     void add(T *o) //these are virtual fns in dlist
     {
        //will call push
     }

    //template <typename T>
    T * remove() //these are virtual fns in dlist
    {
        //will call pop
    }

    //template <typename T>
    Stack()
    {
        //i have NO idea what to put in here
    }

};//end class

Но когда у меня есть строка

 Stack <double> stack;

в моем int main (), VisualStudio FLIPS OUT.

ошибка C2062: тип 'double' неожиданный

ошибка C2065: 'Stack': необъявленный идентификатор

Итак: как правильно создать иВызовите, подклассы шаблонного класса?

Мне не разрешено использовать cstdlib для моих вещей.Yay домашнее задание!

1 Ответ

1 голос
/ 21 января 2012

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

Вот код:

DList:

template<typename T>
class Dlist
{
private:
    T* first;
    T* last;

public:
    Dlist()
    {
        this->first = NULL;
        this->last = NULL;
    }

    T* remove() 
    { 
        return NULL; 
    }

    void add(T* obj) 
    {
        // add algorithm
    }
};

Stack:

template<typename T>
class Stack : protected Dlist<T>
{
public:
    Stack()
        : Dlist<T>() // if you need to call constructor code from the base
    {
    }

    void push(T* obj)
    {
        this->add(obj);
    }

    T* pop()
    {
        return this->remove();
    }
};

Декларация:

Stack<double> stack;

Примечание в этой строке:

class Stack : protected Dlist<T>

Он защищен, потому что если вам нужен стек и он наследует Dlist как открытый, у вас все равно будет Dlist с функциями Stack.

...