C++ - 已经模板化类的继承?
问题描述:
所以我一直在用Java/C#搞怪,并且有很多(显然)忘记了如何用C++编程。C++ - 已经模板化类的继承?
我有一个我创建的模板双向链表(“Dlist”)。它被放置在一个头文件(上帝,头文件是奇怪的),并在CPP中实现。
所以,如果我记得小C++我知道对不对,在CPP一个FN看起来是这样的:
//ctor
template <typename T>
Dlist<T>::Dlist()
{
first = NULL;
last = NULL;
return;
}//end fn
我想创建一个子类对这个DLIST的。在一个新的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主要(),Visual Studio中翻转出来。
错误C2062:类型 '双' 意外
错误C2065: '栈':未声明的标识符
所以:我怎么正确地创建,并调用,一个模板类的子类?
我是不是允许使用cstdlib作为我的东西。 Yay作业!
答
其实你不需要模板上的删除功能。尝试删除它。此外,在使用模板化类时,您最有可能将大部分函数直接实现到头文件中,因此编译器将知道如何根据传递的类型生成方法。
下面的代码:
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>
它的保护,因为如果你想要一个堆栈,并继承Dlist作为公共,你仍然会有一个Dlist与堆栈函数。
如果编译器抱怨'double'或许它不知道Stack是一个模板。你在主文件中包含了stack.h吗? –
这可能是最好的选择一本好书,并更好地熟悉C++的一般。你不会真正使用指针,或者在构造函数中进行赋值,或者在惯用C++中从构造函数中返回。 –
我没有stack.h - 这似乎没有必要。我是否真的必须将这些子类中的任何一个(以及任何未来的子类)分解为两个文件 - 一个松散定义的头文件和一个已实现的cpp文件? –