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.