templates +statische Var. u. Funk. in C++

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

templates +statische Var. u. Funk. in C++

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!

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: templates +statische Var. u. Funk. in C++

Beitrag von GoKi » 14.03.2009 18:00:16

In deiner Zeile 29 fehlt der Typ der Variablen.

Code: Alles auswählen

template<class T> T Stack<T>::zaehler=0;
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

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: templates +statische Var. u. Funk. in C++

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!

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: templates +statische Var. u. Funk. in C++

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

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: templates +statische Var. u. Funk. in C++

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!

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: templates +statische Var. u. Funk. in C++

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

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: templates +statische Var. u. Funk. in C++

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

Code: Alles auswählen

   dStack.push(10);
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!

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: templates +statische Var. u. Funk. in C++

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

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: templates +statische Var. u. Funk. in C++

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!

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: templates +statische Var. u. Funk. in C++

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 8)
MfG GoKi
:wq

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: templates +statische Var. u. Funk. in C++

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 8)
Für einen Anfänger wie mich, JA ;-)
Oh, yeah!

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: templates +statische Var. u. Funk. in C++

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

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: templates +statische Var. u. Funk. in C++

Beitrag von Duff » 15.03.2009 13:11:40

So hatte ich es auch verstanden. Ungünstig ausgedrückt von mir.
Oh, yeah!

Antworten