Abstrakte Klasse als Typ eines Container



  • Ich habe eine (abstrakte) Klasse die eine abstrakte Methode hat:

    class CInterfaceObject
    {
    public:
        virtual void Tick(boolean &ProcessInput) abstract;
    }
    

    Jetzt ist das Problem, dass wenn ich versuche die Klasse als Typ eines boost::PTR_Containers zu verwenden (oder einem std::container)

    boost::ptr_vector<CInterfaceObject> InterfaceObjects;
    

    Dann meckert er das er keine Instanz davon erstellen kann(was ja ansich verständlich ist) - nur ich will ja ansich keine Objekte/Pointer von der abstrakten Klasse speichern sondern nur Objekte der abgeleiteten Klassen die Tick implementieren. Wenn man den Fehler beim ptr_vector anguckt dann steht bei der Fehlerstelle:

    //
    // @remark: if you get a compile-error here,
    // it is most likely because you did not
    // define new_clone( const T& ) in the namespace
    // of T.
    //

    Ich weiß aber nicht ob das für mich zutrifft. Btw: Ich habe nicht allzuviel Ahnung von Templates



  • wie erstellst du denn den ptr_vector? bissl code wär ganz nützlich.

    aber da ich ne kleine idee hab, zitier ich mal was aus der boost referenz:
    http://www.boost.org/doc/libs/1_35_0/libs/ptr_container/doc/tutorial.html
    (abschnitt cloneability)

    Copying or assigning the container has the same effect as cloning (though it is slightly cheaper):

    zoo_type yet_another_zoo = zoo;

    wenn du im ptr_vector eine funktion verwendest, die in irgendeiner weise objekte kopiert, muss eine gültige new_clone funktion bestehen. Für die normalen Fälle hat der ptr_vector eine passende implementation. Dein Fall ist aber nicht normal, da du nur abstrakte Basisklassen speicherst. Abstrakte basisklassen sind nicht einfach kopierbar, sondern brauchen eine clone funktion.

    Beispielsweise:

    class Base
    {
        public:
            virtual Base* clone()const=0;
    };
    
    Base* new_clone(const Base& b)
    {
         return b->clone();
    }
    class Derived
    {
        public:
            virtual Derived* clone()const
            {
                return new Derived(*this);
            }
    };
    


  • Abstrakte Methoden in C++ werden wie folgt deklariert:

    class CInterfaceObject
    {
    public:
        virtual void Tick(boolean &ProcessInput) = 0;
    }
    

    UND

    Klassen in C++/CLI werden wie folgt deklariert:

    ref class CInterfaceObject
    {
    public:
        virtual void Tick(boolean &ProcessInput) abstract;
    }
    

    Beides Zusammen geht schlecht.
    Simon



  • Dank euch, habs jetzt hinbekommen und war einfacher als gedacht. Ich hatte es bereits versucht eine new_clone Funktion als Methode der abstrakten Klasse zu erstellen, aber das hatte nicht funktioniert, nun steht sie ausserhalb der Klasse im entsprechenden Namespace.


Log in to reply