2013-10-08 22 views
0

我想學習和實現類,並遇到了實現嵌套類的這個問題。我已經實現了它的一個版本。我想問你是否認爲它是嵌套類的好例子?我們如何在不嵌套這些類的情況下實現相同的目的?如何拿出好的設計?

#include<iostream> 

class Stack { 
    class Node { 
     public: 
      int data; 
      Node* next; 
      Node(int data, Node* next); 
      ~Node(); 
    }* head; 
    public: 
     Stack(); 
     Stack(const Stack& s); 
     void operator=(const Stack& s); 
     ~Stack(); 
     void push(int data); 
     int peek() const; 
     int pop(); 
}; 
+0

首先,如果複製,你的課程將中斷。您需要複製構造函數和賦值運算符。接下來,你的peek函數可以是const。 –

+0

「實現嵌套類的問題」我認爲如果你問這個問題會更好。 – SigTerm

+0

@NeilKirk打破課堂,你是什麼意思?並且只是爲了確認,編譯器將不會創建複製構造函數和賦值運算符,因爲構造函數已經被定義了,因爲它的規則是三? –

回答

3

我想問問你是否會認爲這是一個很好的一流的設計?

沒有,因爲你不需要鏈表實現棧,因爲因爲你不是使用現有的解決方案(如std::stackstd::vectorstd::deque)你不拋出異常,因爲你的類不服從rule of three

template<typename Val> class Stack{ 
protected: 
    typedef std::vector<Val> Data; 
    Data data;  
public: 
    const Val& top() const{ 
     if (!data.size()) 
      throw std::underflow_error(); 
     return data[data.size()-1]; 
    } 
    void push(const Val& arg){ 
     data.push_back(arg); 
    } 
    Val pop(){ 
     Val result = top(); 
     data.pop_back(); 
     return result; 
    } 
}; 

實現嵌套類的這個問題。

對於「嵌套類練習」鏈表更合適。

我應該怎麼辦?我應該怎麼做呢?

儘量少寫,重複使用現有的解決方案,並保持簡單。

有什麼好書嗎?

應該有關於設計模式的書籍,但它可能爲時尚早。我建議繼續練習一段時間,最好使用你感興趣的實際問題。

+0

「你沒有使用現有的解決方案(如std :: stack)」。這有點苛刻。做一個新的解決方案作爲學習練習是很好的。 –

+2

@NeilKirk:雖然這是事實。重塑車輪是一個很好的練習,但它不是一個很好的設計。 – SigTerm

0

我個人認爲嵌套類可以是一個很好的設計選擇,但是你需要權衡它們是否適合你的當前情況。在你的具體情況下,我把它作爲一個嵌套類來實現似乎很好。我認爲這一點很重要,即嵌套類只有很少功能和特定於它嵌套在類

進一步討論一下在這個線程:Pros and cons of using nested C++ classes and enumerations?

希望這有助於:)

編輯:一種不同的方法是將它作爲一個扁平類結構來實現,而不要嵌套這些類。這具有一些優點,例如前向聲明的可能性,這對於更復雜的結構可能是有用的。