所以我对Java / C#有点迷恋,并且(显然)忘记了如何用C++编程。
我已经创建了一个模板化的双向链接列表(“Dlist”)。它放在头文件中(上帝,头文件很奇怪),并在CPP中实现。
因此,如果我还记得我所知的一点C++,那么CPP中的fn看起来像这样:

//ctor
template <typename T>
Dlist<T>::Dlist()
{
    first = NULL;
    last = NULL;
    return;
}//end fn
我想为此Dlist创建一对子类。在一个名为“stack.cpp”的新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()中,Visual Studio FLIPS OUT。

因此:如何正确创建和调用模板化类的子类?
我不允许将cstdlib用于我的东西。是的,功课!

最佳答案

实际上,您不需要删除功能模板。尝试将其删除。另外,在使用模板化类时,最有可能直接将大多数函数实现到 header 中,因此编译器将根据所传递的类型知道如何生成方法。

这是代码:

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
    }
};

堆栈:
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>

它受到保护,因为如果您想要一个堆栈,并以公共(public)方式继承Dlist,您仍然会拥有一个具有Stack功能的Dlist。

10-06 07:09