virtuelle statische Methode



  • Hi!

    Ich suche eine Möglichkeit Folgendes zu realisieren: (Aufgabe von unserem Prof zum Thema Software-Design)

    Jede Klasse leitet von Klasse "object" ab und kann nur über eine statische create-Methode erstellt werden. C'toren sind protected und der D'tor muss public sein, sowie die create-Methode. Templates dürfen nicht benutzt werden.

    Ich habe folgendes implementiert, doch das will nicht funktionieren:

    class object
    {
    protected:
        object ()
        { }
    
    public:
        virtual ~object ()
        { }
    
        virtual static object* create (void* data) = 0;
    };
    
    class class_a :
        public object
    {
    private:
        class_a ()
        { }
    
    public:
        ~class_a ()
        { }
    
        static object* create (void* data)
        { return (new class_a ()); }
    };
    
    class class_b :
        public object
    {
    private:
        class_b ()
        { }
    
    public:
        ~class_b ()
        { }
    
        static object* create (void* data)
        { return (new class_b ()); }
    };
    
    int main ()
    {
        object* a = class_a::create (0);
        object* b = class_b::create (0);
    
        delete b;
        delete a;
    }
    

    Es erzeugt mir folgende Fehler:

    main.cpp(16) : error C2216: 'virtual' cannot be used with 'static'
    main.cpp(30) : warning C4526: 'class_a::create' : static member function cannot override virtual function 'object *object::create(void *)'
            override ignored, virtual function will be hidden
            main.cpp(16) : see declaration of 'object::create'
    main.cpp(31) : error C2259: 'class_a' : cannot instantiate abstract class
            due to following members:
            'object *object::create(void *)' : is abstract
            main.cpp(16) : see declaration of 'object::create'
    main.cpp(45) : warning C4526: 'class_b::create' : static member function cannot override virtual function 'object *object::create(void *)'
            override ignored, virtual function will be hidden
            main.cpp(16) : see declaration of 'object::create'
    main.cpp(46) : error C2259: 'class_b' : cannot instantiate abstract class
            due to following members:
            'object *object::create(void *)' : is abstract
    main.cpp(16) : see declaration of 'object::create'
    

    Ich denke mal, dass Hauptproblem ist, dass "virtual" nicht auf "static"-Methoden angewand werden kann.

    Hat jemand eine Idee, wie ich die Aufgabe lösen kann?

    Viele Grüße!
    Euer Software Coder 🙂



  • Lass object::create weg.



  • Aber wie kann ich dann festlegen, dass jede Klasse, die von "object" ableitet, "create" implementieren muss? Denn dafür sind ja pure virtual Methods da?



  • In dem du schleunigst das virtual entfernst 😉
    Virtual hat nur Sinn, wenn du Objekte über nen Basisklassenzeiger ansprechen willst, und trotzdem sicher gehen musst, dass auch wirklich die Methode der abgeleiteten Klasse aufgerufen wird.

    Da du statische Methoden immer in der Form value = Class::Methode(); aufrufst, kann niemals nicht ermittelt werden, was du jetzt meinst, wenn du die statische Methode der Basisklasse aufrufst (die zu allem Übel auch nocht pure virtual ist...).

    Das ist in der Frage auch sicherlich nicht so gemeint.
    Du sollst ein Objekt einfach nicht selber erstellen können, sondern nur über eine statische Funktion. Mehr nicht.



  • Software Coder schrieb:

    Aber wie kann ich dann festlegen, dass jede Klasse, die von "object" ableitet, "create" implementieren muss? Denn dafür sind ja pure virtual Methods da?

    Um statische virtuelle Methoden oder virtuelle Konstruktoren sinnvoll nutzen zu können, bräuchte man Metaklassen bzw. Klassenreferenzen, und die gibt es in C++ nicht. Daher läßt sich auch das Vorhandensein einer solchen Funktion natürlich nicht ohne weiteres erzwingen.



  • Statische Methoden koennen nie virtuell sein, virtuelle Methoden koennen nie statisch sein. Die virtuelle Methodentabelle wird erst vom Konstruktor angelegt, statische Methoden sind aber schon vor jedem Konstruktoraufruf verfuegbar.

    Btw. Wie lautet die Aufgabe? Ich sehe nur Text ohne Fragestellung und ohne Aufforderung.

    Hinweis - Erster Satz: Dort steht nichts darueber, dass "Object" die create-Methode anbieten soll, sondern vielleicht nur jede abgeleitete Klasse a la:

    class MegaObject : public Object { ... }
    MegaObject* MegaObject::create() { new MegaObject }
    


  • knivil schrieb:

    class MegaObject : public Object { ... }
    MegaObject* MegaObject::create() { new MegaObject }
    

    <klugscheiß>
    Das geht nur in Python, in C++ braucht es da noch ein return 😛
    </klugscheiß>
    😉



  • Ok, extra fuer MegaObject::create():

    return
    


  • Was Du suchst, ist das Named Constructor Idiom.



  • In C++ braucht man sogar noch ein Semikolon!!!!???
    Ich find diese named constructors eher praktisch wenn man mit smart-pointern arbeitet und verhindern möchte, dass es nicht-referenzgezählte Objekte von dem Typ gibt (außerdem kann das auch tipparbeit ersparen...). Bevorzugt ihr das auch so?


Anmelden zum Antworten