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~


Anmelden zum Antworten