2010-11-25 6 views
0

Ich habe versucht, Stacks als Vorlage darzustellen, ich benutzte eine Struktur und alles ist gut, aber jedes Mal, wenn ich eine Template-Funktion schreiben wollte, musste ich die gleiche Template-Anweisung schreiben, die nicht korrekt zu sein schien -Obwohl ArbeiterWie verwende ich eine einzelne Template-Anweisung für mehr als eine Funktion oder Struktur?

So wie kann ich ein Template-Anweisung für alle Funktionen schreiben ?, hier ist mein Code:

 
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; 
    } 
} 

Hoffnung, was ich meine klar ist jetzt, sorry für die leichte Frage :(

danke im voraus

+2

Hmm ... Sie scheinen ein grundlegendes Missverständnis über Vorlagen und Objekte zu haben. Sie schreiben hier Code in einem sehr C-ischen Stil - anstatt Memberfunktionen zu erstellen, erstellen Sie freie Funktionen, die einen Zeiger auf eine Instanz nehmen. Außerdem sollte dies nicht einmal kompiliert werden, da Sie 'Stack *' nicht ohne den Template-Parameter deklarieren können. –

+0

Ich verstehe Vorlagen und OOP auch gut, aber ich habe meine Gründe in meinen Kommentaren auf die Antwort unten erklärt, und ich habe diesen Code in einem vollständig funktionierenden Programm verwendet, mit einer Konsolenanwendung –

Antwort

3

Wenn (wie es scheint, basierend auf Ihrem Kommentar) Sie sie als freie Funktionen möchten, können Sie nicht. Sie werden auch die Stack Parameter ändern müssen, so etwas wie dieses:

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

Wie es aussieht, ich bin aber nicht allzu begeistert über Ihr Design. Sie versuchen, den Stack Typ als einen tatsächlichen Stapel, und als einen einzigen Knoten (Cell) in den Stapel zu verwenden. Dies ist im besten Fall unnötig verwirrend.

Edit: Was Stapel vs. Knoten geht, was ich rede ist (wie im Code sofort oben): Stack *Cell = new Stack(); - Sie eine einzelne Zelle, die Zuweisung von in der Stapel geht, aber der Typ, den Sie dafür verwenden, ist istStack.

Ich würde so etwas tun, statt:

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; 
} 

Es ist nicht viel Unterschied machen, was Sie wirklich tun, aber wenn man etwas auf einen Stapel setzen ist, Aufteilung eines Stack<T>::node scheint (zumindest für mich) viel sinnvoller zu sein als eine Stack<T> zuzuweisen. Ein Stack mit mehreren Knoten ist sinnvoll - ein Stack mit mehreren Stacks tut dies nicht.

+0

Ich habe nicht wirklich verstanden, was Sie über den tatsächlichen Stack und den Knoten gesagt haben, welches Design schlagen Sie stattdessen vor? –

+0

Warum benötigen Sie einen Verweis auf einen Zeiger auf Stack ? Warum nicht einfach 'Stack & s'? –

+0

@Alex: Jetzt, wo Sie es erwähnen, Sie wahrscheinlich nicht - ich kopierte diesen Teil von seinem Code, ohne es zu aktualisieren. –

0

Sie könnten einfach eine Vorlagenklasse schreiben und all diese Funktionen als Methoden dieser Klasse schreiben. Sie teilen dann die gleichen Template-Parameter wie die Klasse.

+0

Ich tat, aber aucally ich versuche in beiden Richtungen zu repräsentieren –

+0

Gibt es einen bestimmten Grund? –

+0

Ja da ist, ich schreibe tatsächlich eine Semi-Vorlesung und die Leser haben noch keine Klassen gelernt, also muss ich ihnen die tollen Verwendungen von Templates zeigen indem sie Stack darstellen, aber ohne OOP –

Verwandte Themen