2012-01-21 84 views
1

所以我一直在用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作业!

+0

如果编译器抱怨'double'或许它不知道Stack是一个模板。你在主文件中包含了stack.h吗? –

+0

这可能是最好的选择一本好书,并更好地熟悉C++的一般。你不会真正使用指针,或者在构造函数中进行赋值,或者在惯用C++中从构造函数中返回。 –

+0

我没有stack.h - 这似乎没有必要。我是否真的必须将这些子类中的任何一个(以及任何未来的子类)分解为两个文件 - 一个松散定义的头文件和一个已实现的cpp文件? –

回答

1

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

下面的代码:

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与堆栈函数。

+0

我totalyl忘了 - 我实际上没有在我目前的版本。在OP中将其评论/编辑。 –

+0

我正在为你做一个例子。 – WoLfulus

+0

@CoryGordinier我刚刚更新了答案。 – WoLfulus