2012-01-21 36 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