Typ-Zuweisung zur Laufzeit



  • Hallo,

    hab mir eine Klasse geschrieben, und daraus drei weitere Klassen abgeleitet.
    Nun soll je nach der 'int id' das Objekt 'mousepaint' von dem entsprechenden
    Typ werden. Wie schaffe ich das?

    //////////////////////////////////////////////////////////////

    int main(int argc, char** argv)
    {
    // SO GEHT'S NICHT 😞
    switch (id)

    case 1:
    LineWidget* mousepaint=new LineWidget(qmainwindow);
    break;
    case 2:
    StarWidget* mousepaint=new StarWidget(qmainwindow);
    break;
    case 3:
    PolygonWidget* mousepaint=new PolygonWidget(qmainwindow);
    break;
    case 0:
    default:
    PaintWidget* mousepaint=new PaintWidget(qmainwindow);
    break;
    }

    class PaintWidget:public QWidget {
    /* (...) */
    };

    class LineWidget:public PaintWidget {
    /* (...) */
    };

    class StarWidget:public PaintWidget {
    /* (...) */
    };

    class PolygonWidget:public PaintWidget {
    /* (...) */
    };



  • Du musst dich auf einen gemeinsamen Typ einigen. Dafür eine Basisklasse (zB. zwischen QObjekt und PaintWidget) erstellen.

    Die abgeleiteten Klassen überschreiben dann die gemeinsamen Methoden.
    Am besten nochmal im Buch nachlesen.

    (oder ist id konstant?)



  • Du willst ne factory. Schau dir mal das hier an: http://www.dev-geeks.org/forum/viewtopic.php?t=110

    Du musst die Klassen halt bei der factory registrieren, und einen gemeinsamen Basistyp definieren, aber darum kommst du so oder so nicht herum. Ich denke, das Beispiel, dass ich zu dem Code dazu gepackt habe, ist recht anschaulich, ansonsten ist der Code sehr ausführlich dokumentiert. In deinem Fall sähe das am einfachsten wohl so aus:

    typedef factory<int, PaintWidget> factory_t;
    
    // ...
    
    factory_t::register_class<PaintWidget>(1);
    factory_t::register_class<LineWidget>(2);
    factory_t::register_class<StarWidget>(3);
    factory_t::register_class<PolygonWidget>(4);
    
    // ...
    
    PaintWidget *mousepaint = factory_t::create(id);
    
    // ...
    
    delete mousepaint;
    

Anmelden zum Antworten