Dereferenzierung
-
Hallo.
Ich habe heute ein bisschen mit Klassen herum gespielt und ein kleines Problem.
Hier ist erstmal der Quelltext :main.cpp
#include <iostream> #include <vector> #include "BaseObject.h" #include "Erbe.h" int main() { std::vector<BaseObject*> vObjects; Erbe erbe, erbe2, erbe3; vObjects.push_back(&erbe); vObjects.push_back(&erbe2); vObjects.push_back(&erbe3); erbe.DoJob(); erbe.DoSomething(); for(std::vector<BaseObject*>::iterator i = vObjects.begin() ; i != vObjects.end(); ++i) { *i->DoSomething(); } return EXIT_SUCCESS; }
BaseObject.h
#ifndef BASEOBJECT_H #define BASEOBJECT_H #include <iostream> class BaseObject { public: virtual ~BaseObject() { }; virtual void DoSomething() = 0; void DoJob(); void* GetThis(); }; #endif
BaseObject.cpp
#include "BaseObject.h" void BaseObject::DoJob() { std::cout << "BaseObject::DoJob()" << std::endl; } void* BaseObject::GetThis() { return this; }
Erbe.h
#ifndef ERBE_H #define ERBE_H #include <iostream> #include "BaseObject.h" class Erbe : public BaseObject { public: virtual void DoSomething(); }; #endif
Erbe.cpp
#include "Erbe.h" void Erbe::DoSomething() { std::cout << "Erbe::DoSomething()" << std::endl; }
Ich hab eine abstrakte Basis-Klasse BaseObject von der Erbe erben soll.
Als nächstes hab ich in main() einen Vektor erstellt, der Zeiger auf meine Basis-Klasse aufnehmen kann.
Diesen Vektor auch gleich mit 3 Objekten meines Erben gefüllt.
Als nächstes probiere ich durch den Vektor zu iterieren und die Methode DoSomething() für jedes i aufzurufen.Da ist auch das Problem.
Wie muss ich nun i dereferenzieren, das ich die Methode aufrufen kann ?
Im Moment bekomme ich noch die Fehlermeldung : "Der linke Teil von '->DoSomething' muss auf Klasse/Struktur/Union zeigen"
Ich kann es fehlerfrei kompilieren, wenn ich eine temporäre Instanz von BaseObject deklariere, dieser dann die Adresse auf die i zeigt zuweise und die Methode über BaseObject aufrufe. Aber das kann man sicherlich besser lösen.Danke schonmal im Voraus für eure Bemühungen
Lump~
-
(*i)->DoSomething();
-
FireFlow schrieb:
(*i)->DoSomething();
main.obj - 0 Fehler, 0 Warnung(en)
Danke sehr !
Aber was bedeuten diese Klammern nun im genauen ?
-
Lumpensammler schrieb:
Danke sehr !
Aber was bedeuten diese Klammern nun im genauen ?Gegenfrage:
(3+4)*5
Was bedeuten die Klammern?
-
Wenn du die Klammern weglässt liest es der Compiler so:
*(i->DoSomething()); // ->falsch, denn i ist in dem Fall ein Pointer auf einen Pointer
Richtig ist:
(**i).DoSomething(); // -> richtig, **i ist das Objekt selbst
(*i)->DoSomething(); // -> richtig *i ist ein Pointer auf das Objekt
-
Ah..klingt logisch.
Nun ist alles klar !
Danke für die (sehr) schnelle Hilfe.
Lump~