所以我对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。