BasisKonstruktor braucht die Argumente des Abgeleiteten Konstruktors



  • Ich hab mal wieder ein kleines Problem und steh grad auf dem schlauch,
    ich hoff jemand blickt mein problem ist nicht ganz leicht zu erklären.

    Ich habe eine Basisklasse von der ich eine weitere klasse ableite.
    Wenn ich nun den konstruktor der abgeleiteten klasse aufrufe gebe ich ihm
    einige argumente mit. Diese Argumente soll der Konstruktor der Basisklasse,
    der ja implizit auch aufgerufen wird auch erhalten (den er braucht sie eigentlcih)
    nur erhält er die argumente nicht, er wird als normaler default-konstruktor aufgerufen.
    So sehen die Konstruktoren aus

    figure(const char* =NULL,int=800,int=600); //Basis
    moveable_figure(const char* =NULL,int=800,int=600); //abgeleitet
    

    ich instanziere ein objekt,
    moveable_figure back2("schlaeger.png");
    jedoch erhält der basiskonstruktor nicht dieses argument sondern er nimmt das default-argument null.

    Wie kann ich das umgehen? Hat einer nenn Vorschlag?
    Wenn es zu schelcht erklärt ist sagt es 🙂



  • Storm.Xapek.de schrieb:

    Diese Argumente soll der Konstruktor der Basisklasse,
    der ja implizit auch aufgerufen wird auch erhalten (den er braucht sie eigentlcih)
    nur erhält er die argumente nicht, er wird als normaler default-konstruktor aufgerufen.

    Ja, das mußt Du in der Implementierung Deines Konstruktors auch hinschreiben!

    moveable_figure(const char* name=NULL,int x=800,int y=600) : figure(name, x, y)
    {
      // Rest vom Konstruktor
    }
    


  • Funktioniert!
    Danke.
    Dieses "Feature" hab ich noch nicht gekannt,
    man lernt halt nie aus. Weist du zu fällig,
    wie man ein solches Vorgehen nennt?
    (oder Stichwörter worunter amn das findet,
    ich möchte mich da mal genauer informieren)



  • "Initialisierungsliste"

    Dort kannst Du übrigens auch die Member der Klasse auf gleiche Weise initialisieren.

    class X {
      vector<string> args;
    
      X(int argc, const char** argv):
        args(argv, argv + argc)
      {}
    };
    


  • Das hinter dem Doppelpunkt heißt Initialsierungsliste. Man kann dort auch seine Membervariablen initialisieren. Dann benötigen die keinen Default-Konstruktor, sondern werden direkt mit dem Argument konstruiert. Das ist unter Umständen auch schneller, als erst Default-Konstruktor und dann Zuweisung. Wichtig dabei ist, daß die Member in der Reihenfolge initialisiert werden, wie sie in der Klasse stehen, nicht in der Reihenfolge in der Initialisierungsliste. Daher macht man die beiden am besten in der gleichen Reihenfolge, um nicht aus versehen auf etwas nicht initialisiertes zuzugreifen.

    Siehe auch Effektiv C++ Programmieren. 🙂

    MfG Jester


Anmelden zum Antworten