2010-11-25 5 views
0

私はテンプレートとしてStacksを表現しようとしていましたが、構造体を使用していましたが、すべてがうまくいきましたが、テンプレート関数を記述するたびに、同じテンプレート文を書く必要がありました-although working-複数の関数または構造体に対して1つのTemplate文を使用するにはどうすればよいですか?

それでは、どのように私はここに?、すべての機能のための1つのテンプレート文を書くことができます私のコードは次のとおりです。

 
template <typename T> 
struct Stack 
{ 
    T Value; 
    Stack* next; 
}; 
template <typename T> 
void Push(T Value,Stack* &Top) 
{ 
    Stack * Cell = new Stack(); 
    Cell->Value = Value; 
    Cell->next = Top; 
    Top = Cell; 
}; 
template <typename T> 
bool IsEmpty(Stack * Top) 
{ 
    return (Top==0); 
} 
template <typename T> 
void Pop(T &Value,Stack* &Top) 
{ 
    if (IsEmpty(Top)) 
     cout * Temp = Top; 
     Value = Top->Value; 
     Top = Top->next; 
     delete Temp; 
    } 
} 
template <typename T> 
void GetTop(T &Value, Stack* &Top) 
{ 
    if (IsEmpty(Top)) 
     cout Value; 
} 
template <typename T> 
void EmptyStack(Stack * &Top) 
{ 
    Stack * Temp; 
    while (!(IsEmpty(Top))) 
    { 
     Temp = Top; 
     Top = Top->next; 
     delete Temp; 
    } 
} 

私が何を意味するか希望は、今わずかな質問:(

を気の毒に明確です

ありがとうございます。

+2

ええと...あなたはテンプレートとオブジェクトについて根本的な誤解があるようです。ここでは非常にC-ishスタイルのコードを記述しています。メンバ関数を作成するのではなく、インスタンスへのポインタを取る自由な関数を作成しています。また、テンプレートパラメータなしで 'Stack * 'を宣言することができないので、これをコンパイルするべきではありません。 –

+0

私はテンプレートとOOPもはっきりと理解していますが、私の理由は以下の答えに私のコメントで宣言しています。私はコンソールアプリケーションを使って完全に動作するプログラムでこのコードを使用しました –

答えて

3

あなたのコメントに基づいているように見えますが、それらを自由な機能として使いたい場合は、できません。現状では、私もあなたのデザインについても興奮はないよ

template <typename T> 
void Push(T Value, Stack<T>* &Top) 
{ 
    Stack * Cell = new Stack(); 
    Cell->Value = Value; 
    Cell->next = Top; 
    Top = Cell; 
}; 

:あなたは、Stackパラメータを変更するには、このようなものをも持っています。 Stackタイプは、実際のスタックとしての両方を1つのノード(セル)としてスタックとして使用しようとします。これは、最高でも不必要に混乱させます。

編集:限りノード対スタックが行くように、私が話していることは(すぐ上記のコードのように)です:Stack *Cell = new Stack(); - あなたはでスタックを行く単一のセルを割り当てているが、 のタイプはStackです。

私はこの代わりのような何かをしたい:

template <class T> 
struct Stack { 
    struct node { 
     T data; 
     node *next; 
    }; 

    node *head; 
}; 

template <class T> 
void push(T item, Stack<T> *&s) { 
    Stack<T>::node *n = new Stack<T>:node();  
    n->data = item; 
    n->next = s->head; 
    s->head = n; 
} 

それはあなたが本当に何をやっているに違いの多くを作成しませんが、あなたがスタック上に何かを入れているとき、割り当てStack<T>::nodeは、少なくとも私にはStack<T>を割り当てるよりはるかに意味があるようです。複数のノードを含むスタックは意味があります。複数のスタックを含むスタックは実際にはそうではありません。

+0

私はあなたが実際のスタックとノードについて何を言ったかを理解していませんでしたが、代わりにどのようなデザインをお勧めしますか? –

+0

Stackへのポインタへの参照が必要なのはなぜですか?なぜ、「Stack &s'? –

+0

@Alex:今言及したように、おそらくそうではありません。コードを更新せずにコードからコピーしました。 –

0

代わりにテンプレートクラスを書くだけで、そのクラスのメソッドとしてすべての関数を書くことができます。次に、クラスと同じテンプレートパラメータを共有します。

+0

両方向にスタックを表現するには –

+0

特別な理由はありますか? –

+0

はい、私は実際に半講義を書いていますが、読者はまだクラスを習得していないので、スタックを表現することによってテンプレートの優れた使い方を示す必要がありますが、OOPなしで –

関連する問題