Benutzerdefinierter Datentyp bei Vectoren
-
Zagatho_zero87 schrieb:
Diesen Code hier lässt er nicht zu, obwohl die Klasse definiert ist.
Meine Glaskugel ist schon seit Ewigkeiten in der Reparatur, und die Angabe der Fehlermeldung ist scheinbar auch nicht mehr modern.
Siehe auch Du brauchst Hilfe?, besonders den Punkt "Stell deine Fragen präzise".
-
Zagatho_zero87 schrieb:
Diesen Code hier lässt er nicht zu, obwohl die Klasse definiert ist.
Anscheinend musst du sie noch ein wenig mehr definieren. Solche Container verlangen von ihren Datentypen bestimmte Implementationen wie einen copy-ctor & co (klar gibt es compiler-generierte Alternativen, allerdings entfällt der automatisch generierte default-ctor bei wenigstens einem anderweitig definiertem ctor).
-
Sorry!

Dies sind meine Fehler!
Ja ich habe einen Copy-ctor, einen ctor und dtor!main.cpp: In function `int main(int, char**)':
main.cpp:24: error: `main(int, char**)::Token*' uses local type `main(int, char**)::Token'
main.cpp:24: error: trying to instantiate `template<class _Alloc> class std::allocator'
main.cpp:24: error: template argument 2 is invalid
main.cpp:24: error: invalid type in declaration before ';' token
-
Zagatho_zero87 schrieb:
main.cpp:24: error: `main(int, char**)::Token*' uses local type `main(int, char**)::Token'
Das klingt doch ziemlich eindeutig. Definiere Token außerhalb von main.
-
Ok danke!

Jetzt haben sich drei Fehler verabschiedet!einer noch...
[Linker error] undefined reference to `Token::~Token()'
-
kein dekonstruktor
-
Der Destructor fehlt...
also
class Token { .. .. .. ~Token() { // Hier werden die Ressourcen aufgeräumt. Als Faustregel gilt: // wenn keine Heapvariablen vorhanden sind // ( die man mit dem Schlüsselwort new initialisiert ) // muss Du hier auch nichts tun. }
-
Travor schrieb:
Der Destructor fehlt...
also
class Token { .. .. .. ~Token() { // Hier werden die Ressourcen aufgeräumt. Als Faustregel gilt: // wenn keine Heapvariablen vorhanden sind // ( die man mit dem Schlüsselwort new initialisiert ) // muss Du hier auch nichts tun. }Bessere Faustregel: Dann braucht er nicht nur nichts zu tun, er braucht das Ding gar nicht.
-
SeppJ schrieb:
Bessere Faustregel: Dann braucht er nicht nur nichts zu tun, er braucht das Ding gar nicht.
Stimmt auch. Nur hat er den schon in der Klassendeklaration angemeldet. Also muss er eine Definition nach reichen.
Ich allerdings melde immer Destruktoren an. Zum Testen braucht man die eh noch und ab und in einer Basisklasse geht es sowieso nicht anders.
-
Ok danke nochmal für die Antworten!
Also den Destruktor habe ich schon gemacht, aber ich bin drauf gekommen dass ich den copy-constructor gar nicht gemacht habe!
kann das sein das der gemacht werden muss? wenn ja, wie mache ich den?Wenn ich
vector<Token>my_vector in---> vector<Token*>my_vectorändere, funktioniert das ganze!
Kann das sein, dass das wegen dem Copy-Constructor liegt?Hier meine Klasse:
class Token{ private: char tok_ch; float tok_value; public: Token(); ~Token(); };PS: Lerne mit dem Buch Einführung in die Programmierung mit C++ von Bjarne Stroustrup!
-
Zagatho_zero87 schrieb:
Ok danke nochmal für die Antworten!
Also den Destruktor habe ich schon gemacht, aber ich bin drauf gekommen dass ich den copy-constructor gar nicht gemacht habe!
kann das sein das der gemacht werden muss? wenn ja, wie mache ich den?Wenn ich
vector<Token>my_vector in---> vector<Token*>my_vectorändere, funktioniert das ganze!
Kann das sein, dass das wegen dem Copy-Constructor liegt?Hier meine Klasse:
class Token{ private: char tok_ch; float tok_value; public: Token(); ~Token(); };PS: Lerne mit dem Buch Einführung in die Programmierung mit C++ von Bjarne Stroustrup!
Pass mal auf. In diesem Fall bringt dir die Klasse gahnix, weil du auf die Member überhaupt nicht zugreifen kannst.
Es ist übrigens so, dass der Compiler automatisch die folgenden Klassen-methoden generiert, wenn du sie nicht selbst in der Klasse deklarierst (oder auch gleich definierst):- Konstruktor
- Destruktor
- Kopier-konstruktor
- Zuweisungs-operatorEs bestehen nur handfeste Probleme mit diesen Funktionen, wenn du beispielsweise Referenzen oder Zeiger in deiner Klasse hast, die dann auch (!) auf (selbst oder anderweitig) allokierten Speicher zeigen. Wenn du dann nicht selbst Kopier-ctor und Zuweisungsoperator definierst, zeigen zwei Instanzen der Selben Klasse auf eine einzige, heap-allokierte Instanz von etwas anderem (bspw. ein C-Array). Und versuchen dann, beide hintereinander diesen Speicher freizugeben (was natürlich nur blöd ausgehen kann).
struct Token { char tok_ch; float tok_value; };Oder mit gettern/settern.