Problem mit void*



  • Hallo!
    Ich habe folgendes Problem:
    Ich speichere Pointer auf Klassen in einer Map, die void* animmt, nämlich so

    map<LPCSTR,void*> placeholder;
    map<LPCSTR,void*>::iterator pos;
    
    template<typename aClass>void DoSomething(aClass* AnyClass)
    {
       AnyClass->PerformMethod;
    }
    
    MyClass* NewClass = new MyClass();
    placeholder.insert(make_pair("TEST",NewClass));
    
    ....
    //bis irgendwann:
    DoSomething(pos->second);
    

    Bei DoSomething(pos->second) setzt es dann aus, weil der compiler nicht erkennt dass der void-pointer auf eine Klasse zeigt. Ich würde ja die map ändern, aber ich weiss nicht wie ich ihr generische Klassen übergeben kann, falls das möglich sein sollte.



  • [edit] war mal wieder Käse [/edit]

    Wie ist denn genau der Typ Deiner Klasse(n) ?



  • Normalerweise arbeitet man in so einer Situation mit einer Basisklasse.

    Sprich, die map beinhaltet Zeiger auf eine (uU abstrakte) Basisklasse und die Zugriffe erfolgen dann ueber virtuelle Methoden.

    Allerdings ist das eine Frage der Problemstellung...
    uU hilft auch boeses dynamic_casten zum feststellen des Types.



  • Ich habe so etwas wie eine (abstrakte) BasisKlasse:

    template<class AnyClass>class MyClass
    {
    
    }
    

    von dieser Klasse sind alle anderen abgeleitet. Die Pointer dieser abgeleiteten Klassen wollte ich eben innerhalb der map als void* halten, was ich jedoch nicht zustande gebracht habe.

    Danke jedenfalls für eure Hilfestellung



  • Sorry wegen dem Doppelpost. Ich habe es leider auch nicht geschafft den Klassentyp in der map anzugeben. Wenn das möglich ist, dann hab ich den Syntax einfach nicht auf die Reihe bekommen.



  • map<LPCSTR, AnyClass*> foo;

    wo liegt das Problem?



  • hmm, vielleicht sollt ich die verdammte map einfach in die Klasse machen! Danke für den Geistesblitz.



  • Shade Of Mine schrieb:

    map<LPCSTR, AnyClass*> foo;

    wo liegt das Problem?

    Eventuell daran das

    MyClass<AnyClass> * gehalten werden soll und nich AnyClass ?
    (oder hab ich was verpasst !?)

    Hmmm....

    Ich hab das Problem so verstanden:

    #include <map>
    using namespace std;
    
    template <class T>
    struct test
    {
    	T member;
    };
    
    template <class T>
    struct foobar : public test<T>
    {
    	T othermember;
    };
    
    template <typename T>
    struct mapholder
    {
    	std::map<std::string,foobar<T> * > mymap;
    };
    
    int main()
    {
    	mapholder<int> a;
    }
    

    Mit dem Ziel von der Virtuallen Basisklasse aus Methoden aufzurufen.
    (So in richtung Factory)

    [Edit]

    Hmmm....
    Dann wäre aber noch ein op< fällig.....
    Ich leg mich lieber schlafen... n8
    [/edit]



  • Man braucht ne Basisklasse, das habe ich doch gesagt.
    Wo liegt das Problem?

    AnyClass<int>
    und
    AnyClass<foo>

    sind unterschiedliche Typen, also braucht man eine Basisklasse, zB
    AnyBase

    diese könnte man auch als Interface verstehen.



  • Shade Of Mine schrieb:

    Wo liegt das Problem?

    <<< hier liegts: Fehler 99 O🤡

    Hab ich überlesen.


Anmelden zum Antworten