C++ STL Vektor und Pointer zu eigenen Klassen

TVE

Erfahrenes Mitglied
Hi Leute

Ich kriege das mit den eigenen Klassen verwaltet durch einen Vektor einfach nicht richtig zustande.

Code:
//List for storing all the pointers to all objects
list<ReObject*> vectorObject;

...

//ReMobile is a sub class of ReObject, the constructor takes 2 int and 2 char const *
ReMobile *newInstance = new ReMobile(click_x,click_y,"type","name");
vectorObject.push_back(newInstance);

Bis hier hin scheint alles in Ordnung zu sein. Die Instanzen wurden erstellt und der jeweilige Pointer in den Vektor geschrieben.

So nun beginnt mein Übel, wenn ich versuche alle Elemente in einer Schleife durchlaufen zu lassen und irgendwelche Member-Prozeduren aufrufe. In diesem Beispiel möchte ich einfach den Wert ausgeben, den ich damals beim Konstruktor (der Integer click_x) angegeben habe. Meiner Meinung nach hätte das so gehen sollen:

Code:
//This doesn't work! How can I correctly access the class in the memory?
vector<ReObject*>::iterator iVectorObject = vectorObject.begin();
while(iVectorObject != vectorObject.end())
{
	//Do stuff
	if(*iVectorObject != NULL)
	{
		cout<<"An element has X: " << (*iVectorObject).getX() << endl;
	}
	//Iterate...
	iVectorObject++;
}

Ich habe mich hierbei auf das Beispiel beim Deallokieren gestützt, was zu funktionieren scheint:

Code:
//End
vector<ReObject*>::iterator iVectorObject = vectorObject.begin();
while(iVectorObject != vectorObject.end())
{
	if(*iVectorObject != NULL )
	{
		delete(*iVectorObject);
	}
	iVectorObject++;
}

Kann mir da jemand auf die Sprünge helfen?
 
Sorry, war etwas ungenau mit "Es geht nicht..."

Code:
cout<<"An element has X: " << (*iVectorObject).getX() << endl;

Code:
error C2228: left of '.getX' must have class/struct/union type

Naja, scheint einfach so, dass der Pointer nicht reicht, denn das Konstrukt wird nicht als aufruf einer Member-Prozedur erkannt. Wie müsste ich es schreiben, dass ich die Member-Prozedur (oder halt sonst was aus der Klasse) aufrufen kann?
 
Zuletzt bearbeitet:
Du verwendest dort einen Iterator. Wenn du diesen dereferenzierst, erhälst du Zugriff auf ein einzelnes Objekt des Containers. In deinem Fall ist das natürlich dann ein Pointer auf eine Instanz deiner Klasse.

C++:
ReObject* pObj = (*iVectorObject);

cout<<"An element has X: " << (*pObj).getX() << endl;

// oder natürlich direkt:

cout<<"An element has X: " << (*iVectorObject)->getX() << endl;
Gruß
 
Hallo,

ehrlich gesagt wundert es mich, dass der Compiler nicht schon viel früher meckert. vectorObject wird als list<ReObject*> deklariert, der Iterator soll aber vom Typ vector<ReObject*>::iterator sein.

Der von dir beschriebene Fehler ist der, dass du mit der „Dereferenzierung“ des Iterators einen Zeiger auf ein Objekt erhältst. Du musst also entweder nochmals Dereferenzieren oder den Zugriffsoperator -> anstatt . verwenden.

Grüße,
Matthias

<edit>Und ich muss schneller tippen ;)</edit>
 
Du verwendest dort einen Iterator. Wenn du diesen dereferenzierst, erhälst du Zugriff auf ein einzelnes Objekt des Containers. In deinem Fall ist das natürlich dann ein Pointer auf eine Instanz deiner Klasse.

C++:
ReObject* pObj = (*iVectorObject);

cout<<"An element has X: " << (*pObj).getX() << endl;

// oder natürlich direkt:

cout<<"An element has X: " << (*iVectorObject)->getX() << endl;
Gruß

Danke, das hat's gebracht.

Zu Matthias' Kommentar wegen list/vector: Sorry my bad. Die erste Zeile war aus ner alten Version wo ich mit list experimentiert hab. War eigentlich schon vector. (sonst wäre das Programm ja kaum so weit gekommen)

Danke ihr beiden.
 
Zurück