Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
Beitrag
von Duff » 14.03.2009 17:49:40
Hallo,
ich komme mal wieder nicht weiter beim Erlernen der OO-Sprache C++.
Ich bin beim Thema templates und möchte das Programm ein wenig abändern. Ich bin gerade dabei eine statische Variable und Funktion ins Programm zu integrieren, damit ich die Anzahl der Objekte zaehlen kann.
Mein bisheriger Code:
Code: Alles auswählen
// stack.cpp
#include <iostream>
using namespace std;
template<class T> class tNode {
public:
T d;
tNode<T> *next;
};
template<class T> class Stack {
public:
Stack() {
Anker=0;
zaehler++;
}
~Stack();
bool pop(T *);
bool push(T );
static T wieviele() {
return zaehler;
}
private:
tNode<T> *Anker;
int index;
static T zaehler;
};
template<class T> Stack<T>::zaehler=0;
template<class T> Stack<T>::~Stack() {
tNode<T> *last=Anker;
while(Anker) {
last=Anker;
Anker=Anker->next;
delete Anker;
}
zaehler--;
}
template<class T> bool Stack<T>::pop(T *get) {
if(Anker) {
tNode<T> *old=Anker;
Anker=Anker->next;
*get=old->d;
delete old;
return true;
}
return false;
}
template<class T> bool Stack<T>::push(T set) {
tNode<T> *node=new tNode<T>;
node->d=set;
node->next=Anker;
Anker=node;
return true;
}
int main() {
Stack<int> iStack;
int a;
iStack.push(8);
iStack.push(4);
iStack.push(2);
iStack.push(9);
cout << Stack<int>::wieviele() << endl;
for(int i=0;i<3;i++) {
if(iStack.pop(&a))
cout << a << endl;
}
}
Beim Compilieren bekomme ich immer einen Fehler bei meiner globalen Variablen zaehler.
Code: Alles auswählen
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel07$ g++ -Wall -o stack stack.cpp
stack.cpp:29: error: expected constructor, destructor, or type conversion before ‘=’ token
Oh, yeah!
-
GoKi
- Beiträge: 2068
- Registriert: 04.07.2003 23:08:56
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von GoKi » 14.03.2009 18:00:16
In deiner Zeile 29 fehlt der Typ der Variablen.
Ich weiß nur nicht so genau, warum Du das auch T als Typ hast. int oder unsigned int wäre da wohl besser. Oder du willst halt nie einen Stack<double> oder Stack<MeineTolleKlasse> erzeugen.
MfG GoKi
:wq
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
Beitrag
von Duff » 14.03.2009 18:44:49
Danke, dass war's.
GoKi hat geschrieben:
Ich weiß nur nicht so genau, warum Du das auch T als Typ hast. int oder unsigned int wäre da wohl besser. Oder du willst halt nie einen Stack<double> oder Stack<MeineTolleKlasse> erzeugen.
Wie genau meinst du das?
Sorry, aber bin noch nicht wirklich fit in der C++-Programmierung. Beim Lesen ist eigentlich fast immer alles klar, aber nachher in der Praxis sieht das alles wieder anders aus...
Oh, yeah!
-
GoKi
- Beiträge: 2068
- Registriert: 04.07.2003 23:08:56
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von GoKi » 14.03.2009 19:57:32
Dein Zähler in vom Typ T. Also der gleiche Typ, der auch auf dem Stack liegt. Versuch doch mal einen Stack<double> zu erzeugen. Das wird Compile-Fehler liefern, da dann zaehler++ nicht definiert ist.
Dein Zähler selbst hat nichts mit dem Template Typ zu tun, daher reicht int (unsigned int, usw.).
MfG GoKi
:wq
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
Beitrag
von Duff » 15.03.2009 10:15:25
OK, ja. Beim Anlegen eines Objektes mit Stack<double> dStack bekomme ich folgende Fehlermeldung:
Code: Alles auswählen
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel07$ g++ -Wall -o stack02 stack_02.cpp
stack_02.cpp: In function ‘int main()’:
stack_02.cpp:90: error: no matching function for call to ‘Stack<double>::pop(int*)’
stack_02.cpp:54: note: candidates are: bool Stack<T>::pop(T*) [with T = double]
Und hier mein angepasster Code:
Code: Alles auswählen
// stack.cpp
#include <iostream>
using namespace std;
template<class T> class tNode {
public:
T d;
tNode<T> *next;
tNode() {
zaehler++;
}
~tNode() {
zaehler--;
};
static T wieviele() {
return zaehler;
}
private:
static T zaehler;
};
template<class T> class Stack {
public:
Stack() {
Anker=0;
zaehler++;
}
~Stack();
bool pop(T *);
bool push(T );
static int wieviele() {
return zaehler;
}
private:
tNode<T> *Anker;
int index;
static int zaehler;
};
//template<class T> T Stack<T>::zaehler=0;
template<class T> int Stack<T>::zaehler=0;
template<class T> T tNode<T>::zaehler=0;
template<class T> Stack<T>::~Stack() {
tNode<T> *last=Anker;
while(Anker) {
last=Anker;
Anker=Anker->next;
delete Anker;
}
zaehler--;
}
template<class T> bool Stack<T>::pop(T *get) {
if(Anker) {
tNode<T> *old=Anker;
Anker=Anker->next;
*get=old->d;
delete old;
return true;
}
return false;
}
template<class T> bool Stack<T>::push(T set) {
tNode<T> *node=new tNode<T>;
node->d=set;
node->next=Anker;
Anker=node;
return true;
}
int main() {
Stack<int> iStack;
Stack<int> jStack;
Stack<double> dStack;
int a,anzahl;
iStack.push(8);
iStack.push(4);
iStack.push(2);
iStack.push(9);
jStack.push(10);
dStack.push(10);
anzahl=tNode<int>::wieviele();
cout << "Anzahl Objekte: " << Stack<int>::wieviele() << endl;
cout << "Anzahl push: " << tNode<int>::wieviele() << endl;
for(int i=0;i<anzahl;i++) {
if((iStack.pop(&a)) or (jStack.pop(&a)) or (dStack.pop(&a)))
cout << a << endl;
}
}
Oh, yeah!
-
GoKi
- Beiträge: 2068
- Registriert: 04.07.2003 23:08:56
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von GoKi » 15.03.2009 11:07:39
Die Fehlermeldung ist doch eindeutig?
Du darfst an dStack.pop() nur einen double Pointer übergeben. Ich zumindest benutze in C++ Referenzen statt Pointer für Funktionsaufrufe,
http://de.wikipedia.org/wiki/Referenzparameter
MfG GoKi
:wq
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
Beitrag
von Duff » 15.03.2009 12:20:51
GoKi hat geschrieben:Die Fehlermeldung ist doch eindeutig?
Du darfst an dStack.pop() nur einen double Pointer übergeben.
Verstehe ich wiederum nicht so ganz. Habe die Zeile
in [code dStack.push(1.2);][/code] geändert, aber die Fehlermeldung bleibt die gleiche. Ich habe doch extra templates verwendet, damit ich flexibler bin und nicht typengebunden bleibe.
Oh, yeah!
-
GoKi
- Beiträge: 2068
- Registriert: 04.07.2003 23:08:56
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von GoKi » 15.03.2009 12:28:59
push ist nicht das Problem. pop() ist das Problem. Du hast innerhalb des Templates:
Code: Alles auswählen
template <class T>
bool Stack<T>::pop(T *)
{
// dein code
}
Für Stack<double> musst du einen Pointer auf einen double übergeben, für Stack<int> einen int Pointer, für Stack<MeineTolleCppKlasse> einen MeineTolleCppKlasse*, usw.
Also
Code: Alles auswählen
for(int i=0;i<anzahl;i++) {
double d;
if((iStack.pop(&a)) or (jStack.pop(&a)) or (dStack.pop(&d)))
cout << a << endl;
}
Das sollte so kompilieren, ob es sinnvoll ist, ist noch mal eine andere Frage.
MfG GoKi
:wq
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
Beitrag
von Duff » 15.03.2009 12:40:33
Meine Güte, jetzt habe ich es auch verstanden. Hatte an den total falschen Stellen nach dem Fehler gesucht.
Danke für die Geduld
Oh, yeah!
-
GoKi
- Beiträge: 2068
- Registriert: 04.07.2003 23:08:56
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von GoKi » 15.03.2009 12:44:23
Duff hat geschrieben:Hatte an den total falschen Stellen nach dem Fehler gesucht.
Meistens hat die Zeilennummer einen Sinn, die der Compiler als Fehlerstelle nennt.
Leider nur meistens
MfG GoKi
:wq
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
Beitrag
von Duff » 15.03.2009 12:59:16
GoKi hat geschrieben:
Meistens hat die Zeilennummer einen Sinn, die der Compiler als Fehlerstelle nennt.
Leider nur meistens
Für einen Anfänger wie mich, JA
Oh, yeah!
-
GoKi
- Beiträge: 2068
- Registriert: 04.07.2003 23:08:56
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von GoKi » 15.03.2009 13:07:33
Ich bezog das mit dem Sinn der Zeilennummer eher darauf, dass es auch durchaus vorkommen kann, dass die Zeile nicht die Stelle des eigentlichen Fehlers wiedergibt. Bspw. vergessenes Semikolon hinter einer Klasse, falsch geschlossene Klammern, usw.
MfG GoKi
:wq
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
Beitrag
von Duff » 15.03.2009 13:11:40
So hatte ich es auch verstanden. Ungünstig ausgedrückt von mir.
Oh, yeah!