2013-03-28 67 views
2

我想通過使用鏈表實現一個堆棧類。 下面是我在頭文件中如何定義。對於堆棧中的每個元素,也有要素兩個數據:堆棧使用結構或類來實現其私有數據

#ifndef MYSTACK_H_INCLUDED 
#define MYSTACK_H_INCLUDED 
#include <iostream> 
using namespace std; 

template<typename T> 
class MyStack{ 
public: 
    MyStack(); 
    ~MyStack(); 
    ... 
    ... 
private: 
    struct node; 
    node* head; 
    int _top; 
}; 

template<typename T> 
struct MyStack<T>::node { 
    node(node*, T, T); 
    T position_x; 
    T position_y; 
    node* next; 
}; 

但如果我改變在私人領域的結構節點到這樣一類:

#ifndef MYSTACK_H_INCLUDED 
#define MYSTACK_H_INCLUDED 
#include <cstddef> // for std:size_t 
using namespace std; 

template <class T> 
class MyStack{ 
public: 
    MyStack(); 
    ~MyStack(); 
    ... 
    ... 
private: 
    class Node { 
     friend class MyStack<T>; 
    public: 
     Node(T, Node*); 
    private: 
     const T value; 
     Node *next; 
    }; 
    Node *head; 


}; 
#endif // MYSTACK_H_INCLUDED 

是否有必要在Stack類中爲Node創建另一個類或者我只是使用Struct? 爲什麼?

+3

在C++中,'struct'和'class'之間的唯一區別是成員默認的「可見性」。對於'struct',默認值是成員是'public',而'class'是成員是'private'。 –

+0

此外,在第一種情況下,結構_is_是MyStack類中的私有結構,就像第二個示例中的Node類是私有類一樣。這是因爲它是在'MyStack'中聲明的,即使它是一個前向聲明,範圍仍然在周圍的類中。 –

回答

0

只要我不想公開內部數據,我現在正在做的事情。我定義我的鏈表

template <class T> 
class List{ 

    class Node{ 
    public: 

     friend class List;    

    private: 

     private members 
    }; 

    public: 
}; 

我喜歡這種風格,因爲我在Java程序中,這使得在這個格式是舒服,我使用內部和靜態內部類的。

你需要封裝Node的私有字段才能從List訪問它們,但除此之外,你可以定義你的類,甚至使用結構體,但只記得類和結構體之間的區別是結構體成員是公共的默認。