Wieder mal Problem mit STL-Liste
-
Hallo!
Ich hab wieder einmal ein Problem mir einer STL-Liste.
Ich hab folgende Klassendeklaration:#include<string> #include<dirent.h> #include<list> #include<iostream> #include"bomb.h" typedef std::list<Bomb>BombDirList; class BombDir { public: BombDir(std::string _BombPath):BombPath(_BombPath) { AllBombsList=new BombDirList; } ~BombDir() { delete AllBombsList; } bool readBombDir(); void addBombEntry(std::string _BombId,std::string _BombName,std::string _BombColour,unsigned int _BombSize,unsigned int _BombRaiseTime,unsigned int _BombClimbHeight,unsigned int _BombExplodeTime,std::string _BombPicture,std::string _BombMovie,unsigned int _Pos); // bool delBombEntry(std::string _DirName); BombDirList* getBombs() const; //Soll einen Zeiger auf die Liste zurückliefern private: BombDir() //Privat, da nur mit Parameter initialisiert werden soll {} std::string BombPath; BombDirList* AllBombsList; BombDirList::iterator Iter; void MoveIter(unsigned int); };Dann folgende Implementierung:
#include"bombdir.h" using std::string; using std::fstream; using std::ios_base; using std::list; bool BombDir::readBombDir() { AllBombsList->clear(); //Hier spar ich mir jetzt etwas Code. Es werden lediglich die Parameter für BombDir::addBombEntry erfasst. //Die werden aus einer Datei gelesen. Das funktioniert auch. //_Pos ist die gewünschte Position in der Liste. addBombEntry(tempBombId,tempBombName,tempBombColour,tempBombSize,tempBombRaiseTime,tempBombClimbHeight,tempBombExplodeTime,tempBombPicture,tempBombMovie,Pos); return true; } void BombDir::addBombEntry(string _BombId,string _BombName,string _BombColour,unsigned int _BombSize,unsigned int _BombRaiseTime,unsigned int _BombClimbHeight,unsigned int _BombExplodeTime,string _BombPicture,string _BombMovie,unsigned int _Pos) { //Create a temporary Bomb object and fill it with the given parameters Bomb* tempBomb=new Bomb; tempBomb->setBombId(_BombId); tempBomb->setBombName(_BombName); tempBomb->setBombColour(_BombColour); tempBomb->setBombSize(_BombSize); tempBomb->setBombRaiseTime(_BombRaiseTime); tempBomb->setBombClimbHeight(_BombClimbHeight); tempBomb->setBombExplodeTime(_BombExplodeTime); tempBomb->setBombPicture(_BombPicture); tempBomb->setBombMovie(_BombMovie); //Move iterator to the given position MoveIter(_Pos); //Insert temporary BombLaunch object into the list and delete object AllBombsList->insert(Iter,*tempBomb); //Dieser Aufruf bringt den Fehler delete tempBomb; return; } BombDirList* BombDir::getBombs() const { return AllBombsList; } void BombDir::MoveIter(unsigned int _Pos) { Iter=AllBombsList->begin(); for(unsigned int PosCount=1;PosCount!=_Pos;PosCount++) { Iter++; } return; }Der Aufruf AllBombsList->insert(Iter,*tempBomb); bringt eine Fehlerflut.
Die ersten Zeilen:/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/ios_base.h: In copy constructor »std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)«: /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/iosfwd:55: instantiated from »void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = Bomb]« /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_list.h:451: instantiated from »std::_List_node<_Tp>* std::list<_Tp, _Alloc>::_M_create_node(const _Tp&) [with _Tp = Bomb, _Alloc = std::allocator<Bomb>]« /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/list.tcc:87: instantiated from »typename std::list<_Tp, _Alloc>::iterator std::list<_Tp, _Alloc>::insert(std::_List_iterator<_Tp>, const _Tp&) [with _Tp = Bomb, _Alloc = std::allocator<Bomb>]« /home/mase/pyromaster/src/bombdir.cpp:141: instantiated from hereEs sollen Objekte der Klasse Bomb in der Liste gespeichert werden.
Die Methode void BombDir::MoveIter(unsigned int _Pos) soll den
Iterator auf die gewünschte Position setzen.
Kommentiere ich den Aufruf AllBombsList->insert(Iter,*tempBomb); aus, dann
kompiliert's.
In einer anderen Klasse des Programms bin ich genauso vorgegangen, nur da
geht's. Dort werden lediglich Objekte einer anderen Klasse gespeichert.
Sonst ist alles gleich. Die Liste hat noch einen anderen Namen, sonst nichts.
Weiss jemand, wo der Fehler liegt?
-
Wie sieht denn Bomb aus? (Deklaration)
BR
Vinzenz
-
hi leudä, ich hatte mal wie immer nichts zu tun und hab nen bissel eure beiträge gelesen. in dem hier haben sich mir 2 fragen gestellt die vllt. nicht wirklich hier rein passen, da man diese hier aber gerade so schoen veranschulicht sieht am quelltext konnte ich nicht wieder stehen mal nachzufragen, sorry mase! waer cool wenn ihr mir die fragen mal so am rande beantwortet denn ik will ja den beitrag net unnötig stören >.<.
1. wo zu ist den dieser "_"(unterstrich :P) gut
mase schrieb:
void addBombEntry(std::string _BombId,std::string _BombName,std::string _BombColour,unsigned int _BombSize,unsigned int _BombRaiseTime,unsigned int _BombClimbHeight,unsigned int _BombExplodeTime,std::string _BombPicture,std::string _BombMovie,unsigned int _Pos);
da seht ihr ganz viele kleine unterstriche O.o, ich hab des au schon mal gesehen das die doppelt vorn und hinten an einem wort dran hingen so: __wort__ . wozu ist das gut? ( BITTE keine links
)und miene 2. frage die mich beschaeftigt.
wie funktioniert den das?, mase hat sich hier nen eigenen header erstellt mit sicher vielen lustigen funktionen *g* und dann hat er
bei list zw. den <> klammern nen namen namens Bomb gesetzt... ist das nen von nen template deklarierter variable typ ?`und noch mal sorry wollte net stören *psssst ich war nie hier
*
-
mase schrieb:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/ios_base.h: In copy constructor »std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)«: /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/iosfwd:55: instantiated from »void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = Bomb]« /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_list.h:451: instantiated from »std::_List_node<_Tp>* std::list<_Tp, _Alloc>::_M_create_node(const _Tp&) [with _Tp = Bomb, _Alloc = std::allocator<Bomb>]« /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/list.tcc:87: instantiated from »typename std::list<_Tp, _Alloc>::iterator std::list<_Tp, _Alloc>::insert(std::_List_iterator<_Tp>, const _Tp&) [with _Tp = Bomb, _Alloc = std::allocator<Bomb>]« /home/mase/pyromaster/src/bombdir.cpp:141: instantiated from hereEs wäre gut, wenn du dann auch noch den Fehler postest.
-
T0bi schrieb:
da seht ihr ganz viele kleine unterstriche O.o, ich hab des au schon mal gesehen das die doppelt vorn und hinten an einem wort dran hingen so: __wort__ . wozu ist das gut?
Genauso gut könntest du fragen, wozu das i in list gut ist. Der Unterstrich ist ein in Bezeichnern erlaubtes Zeichen wie Buchstaben und Ziffern auch. Es gibt ein paar Besonderheiten, die aber eher willkürliche Festlegungen sind: So ist es z.B. dem Compilerhersteller vorbeihalten, Bezeichner zu verwenden, die mit einem Unterstrich beginnen. Es gibt auch Leute, die ihre Membervariablen mit einem Unterstrich am Ende kennzeichnen.
ist das nen von nen template deklarierter variable typ ?
Ja. std::list ist eine Templateklasse.
-
Die führenden Unterstriche kennzeichnen die Argumente für die Funktion. Das
hab ich mir angewöhnt.Wie gesagt, das Bomb zwischen <> ist der Typ, der in der Liste gespeichert
werden soll.Hier die Deklaration von Bomb:
#include<iostream> #include<fstream> #include<string> class Bomb { public: Bomb() {} Bomb(std::string _Id,std::string _Name,std::string _Colour,unsigned int _Size,unsigned int _RaiseTime,unsigned int _ExplodeTime,std::string _Picture,std::string _Movie):BombId(_Id),BombName(_Name),BombColour(_Colour),BombSize(_Size),BombRaiseTime(_RaiseTime),BombExplodeTime(_ExplodeTime),BombPicture(_Picture),BombMovie(_Movie) {} ~Bomb() {} void setBombId(std::string); void setBombName(std::string); void setBombColour(std::string); void setBombSize(unsigned int); void setBombRaiseTime(unsigned int); void setBombClimbHeight(unsigned int); void setBombExplodeTime(unsigned int); void setBombPicture(std::string); void setBombMovie(std::string); std::string getBombId() const; std::string getBombName() const; std::string getBombColour() const; unsigned int getBombSize() const; unsigned int getBombRaiseTime() const; unsigned int getBombClimbHeight() const; unsigned int getBombExplodeTime() const; std::string getBombPicture() const; std::string getBombMovie() const; bool checkexistBomb(std::string _FileName); bool saveBomb(std::string _FileName); private: std::string BombId; std::string BombName; std::string BombColour; unsigned int BombSize; unsigned int BombRaiseTime; unsigned int BombClimbHeight; unsigned int BombExplodeTime; std::string BombPicture; std::string BombMovie; std::fstream BombFile; };Das ist die vollständige Fehlermeldung:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/ios_base.h: In copy constructor »std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)«: /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/iosfwd:55: instantiated from »void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = Bomb]« /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_list.h:451: instantiated from »std::_List_node<_Tp>* std::list<_Tp, _Alloc>::_M_create_node(const _Tp&) [with _Tp = Bomb, _Alloc = std::allocator<Bomb>]« /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/list.tcc:87: instantiated from »typename std::list<_Tp, _Alloc>::iterator std::list<_Tp, _Alloc>::insert(std::_List_iterator<_Tp>, const _Tp&) [with _Tp = Bomb, _Alloc = std::allocator<Bomb>]« bombdir.cpp:141: instantiated from here /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/ios_base.h:779: Fehler: »std::ios_base::ios_base(const std::ios_base&)« ist privat /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/iosfwd:55: Fehler: in diesem Zusammenhang /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/iosfwd: In copy constructor »std::basic_fstream<char, std::char_traits<char> >::basic_fstream(const std::basic_fstream<char, std::char_traits<char> >&)«: /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/iosfwd:95: Anmerkung: künstlich erzeugte Methode »std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)« zuerst hier erfordert /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/streambuf: In copy constructor »std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf(const std::basic_filebuf<char, std::char_traits<char> >&)«: /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/streambuf:781: Fehler: »std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]« ist privat /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/iosfwd:86: Fehler: in diesem Zusammenhang /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/iosfwd: In copy constructor »std::basic_fstream<char, std::char_traits<char> >::basic_fstream(const std::basic_fstream<char, std::char_traits<char> >&)«: /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/iosfwd:95: instantiated from »void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = Bomb]« /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_list.h:451: instantiated from »std::_List_node<_Tp>* std::list<_Tp, _Alloc>::_M_create_node(const _Tp&) [with _Tp = Bomb, _Alloc = std::allocator<Bomb>]« /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/list.tcc:87: instantiated from »typename std::list<_Tp, _Alloc>::iterator std::list<_Tp, _Alloc>::insert(std::_List_iterator<_Tp>, const _Tp&) [with _Tp = Bomb, _Alloc = std::allocator<Bomb>]« bombdir.cpp:141: instantiated from here /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/iosfwd:95: Anmerkung: künstlich erzeugte Methode »std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf(const std::basic_filebuf<char, std::char_traits<char> >&)« zuerst hier erfordert bomb.h: In copy constructor »Bomb::Bomb(const Bomb&)«: bomb.h:35: Anmerkung: künstlich erzeugte Methode »std::basic_fstream<char, std::char_traits<char> >::basic_fstream(const std::basic_fstream<char, std::char_traits<char> >&)« zuerst hier erfordert /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h: In member function »void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = Bomb]«: /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:104: Anmerkung: künstlich erzeugte Methode »Bomb::Bomb(const Bomb&)« zuerst hier erfordert
-
fstream hat keinen Copy-Konstruktor, du hast allerdings ein fstream-Member in deiner Bomb-Klasse und keinen Copy-Konstruktor für deine Klasse definiert. Also wird der Standard-Copy-Ctor genommen, der für alle Member den Copy-Ctor aufruft, was dann bei fstream fehlschlägt.
Eine Lösung wäre, BombFile zu einer Referenz zu machen.
[Edit] insert ruft den Copy-Ctor auf, deshalb tritt gerade an dieser Stelle der Fehler auf.
-
MFK schrieb:
T0bi schrieb:
da seht ihr ganz viele kleine unterstriche O.o, ich hab des au schon mal gesehen das die doppelt vorn und hinten an einem wort dran hingen so: __wort__ . wozu ist das gut?
Genauso gut könntest du fragen, wozu das i in list gut ist. Der Unterstrich ist ein in Bezeichnern erlaubtes Zeichen wie Buchstaben und Ziffern auch. Es gibt ein paar Besonderheiten, die aber eher willkürliche Festlegungen sind: So ist es z.B. dem Compilerhersteller vorbeihalten, Bezeichner zu verwenden, die mit einem Unterstrich beginnen. Es gibt auch Leute, die ihre Membervariablen mit einem Unterstrich am Ende kennzeichnen.
nicht ganz richtig. für compilerhersteller sind entweder bezeichner mit zwei unterstrichen am anfang ("__compilervariable") oder einem unterstrich mit folgendem Großbuchstaben ("_Compilervariable") vorbehalten.
-
Michael E. schrieb:
...
[Edit] insert ruft den Copy-Ctor auf, deshalb tritt gerade an dieser Stelle der Fehler auf.Das war er ursprünglich als Fehlermeldung gepostet hatte hat mir gereicht das zu vermuten, ich wollte es nur in der Klasse Bomb auch wirklich sehen das er da ein Stream Objekt kopieren will

BR
Vinzenz
-
Fehlender/ falscher Copykonstruktor ist ehh der Fehler #1 beim Umgang mit STL-Containern. f'`8k
Gruß, TGGC (\-/ returns)
-
otze schrieb:
nicht ganz richtig. für compilerhersteller sind entweder bezeichner mit zwei unterstrichen am anfang ("__compilervariable") oder einem unterstrich mit folgendem Großbuchstaben ("_Compilervariable") vorbehalten.
Auch nicht ganz richtig

Bei den zwei aufeinanderfolgenden Unterstrichen ist die Position im Bezeichner egal.
-
Danke für eure Hilfe!
Ich hab den fstream-Member aus der Klasse Bomb entfernt. Den brauch ich dort
nicht unbedingt.
Das fstream-Objekt ist jetzt lokal für die Klassenmethode in Bomb.
-
evilissimo schrieb:
Das war er ursprünglich als Fehlermeldung gepostet hatte hat mir gereicht das zu vermuten, ich wollte es nur in der Klasse Bomb auch wirklich sehen das er da ein Stream Objekt kopieren will

Stimmt, das hat auch gereicht, ums zu sehen. Ich hab mir das allerdings gar nicht genauer angeguckt, weil ichs nicht so prickelnd find, nen Fehler ohne die Fehlermeldung zu suchen.
-
Michael E. schrieb:
evilissimo schrieb:
Das war er ursprünglich als Fehlermeldung gepostet hatte hat mir gereicht das zu vermuten, ich wollte es nur in der Klasse Bomb auch wirklich sehen das er da ein Stream Objekt kopieren will

Stimmt, das hat auch gereicht, ums zu sehen. Ich hab mir das allerdings gar nicht genauer angeguckt, weil ichs nicht so prickelnd find, nen Fehler ohne die Fehlermeldung zu suchen.
Ich hatte doch ne Fehlermeldung. Ich hab mir das angeschaut, geguckt ob Bomb irgendwo von Ihm gezeigt wurde und einfach nur dannach gefragt, das reicht auch :p
BR
Vinzenz
-
evilissimo schrieb:
Ich hatte doch ne Fehlermeldung. Ich hab mir das angeschaut, geguckt ob Bomb irgendwo von Ihm gezeigt wurde und einfach nur dannach gefragt, das reicht auch :p
Nen Fehlerpfad
Wieso so ich-bezogen? Das hier soll keine Kritik darstellen.
-
Michael E. schrieb:
evilissimo schrieb:
Ich hatte doch ne Fehlermeldung. Ich hab mir das angeschaut, geguckt ob Bomb irgendwo von Ihm gezeigt wurde und einfach nur dannach gefragt, das reicht auch :p
Nen Fehlerpfad
Wieso so ich-bezogen? Das hier soll keine Kritik darstellen.
Ich hab dir nur meine Ansicht dazu mitgeteilt mehr nicht. (Deswegen war es Ich-bezogen) Ich hab es nicht als Kritik aufgefasst. 
BR
-
Irgendwie reden wir aneinander vorbei. Naja, lassen wir das und Friede, Freude, Eierkuchen.
-
Danke euch!
Die Klasse funktioniert jetzt einwandfrei!
Jedenfalls soweit ich sie jetzt schon implementiert hab.
Ich hoffe, dass ich den Rest hinkrieg.
Für alle, die's interessiert, was das ganze soll:
Ich will ein Programm für meinen Schwager entwickeln. Der ist hobbymässig
Pyrotechniker. Mit dem Programm soll er seine Abschuss-Sessions entwerfen,
simulieren, und dann vollautomatisch per PC das ganze in den Himmel bringen.
Dazu werden noch sogenannte Launchboxen gebaut, die mit Microcontrollern
und Ralais, die Bomben zünden können. Das ist mein erstes C++ Projekt.
Und gleich so ein grosser Happen.
Bis jetzt gibt es dazu nur sehr kostspielige Lösungen, wo allein die Zünd-
boxen jede Menge Kohle kosten.
Das ganze soll natürlich jedem frei zugänglich sein, inclusive Schaltplänen.
Und das ganze ist für Linux.
Mal sehen, was das noch wird...