000
29.07.2006, 23:41 Uhr
mase
|
Hallo! Ich hab wieder einmal ein Problem mir einer STL-Liste. Ich hab folgende Klassendeklaration:
C++: |
#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:
C++: |
#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:
Code: |
/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 here
|
Es 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? -- May the force be with us! |