In Konstruktor anderen Konstruktor aufrufen



  • Hallo,
    ich habe eine Klasse classification, die über zwei Konstruktoren verfügt:

    classification::classification() : num_tips_i(0), num_subs_i(0), num_crfs_i(0), 
    contains_subs_i(false), contains_crfs_i(false)
    {
    }
    
    classification::classification(const int no, const int num_sites_para)
    {
       ...
    }
    

    Nun würde ich gerne den unteren Konstruktor zuerst (bevor er seinen Code ausführt) das machen lassen, was der obere macht (Der obere Konstruktor erzeugt eine "leere" classification). Wenn ich aber einfach

    classification::classification(const int no, const int num_sites_para) : classification()
    

    schreibe, bekomme ich die Fehlermeldung

    type ‘classification’ is not a direct base of ‘classification’

    Wie sollte man das am besten lösen?



  • Ich würde einfach eine private-Methode verwenden.

    classification::classification() : num_tips_i(0), num_subs_i(0), num_crfs_i(0),
    contains_subs_i(false), contains_crfs_i(false)
    {
    init();
    ...
    }
    
    classification::classification(const int no, const int num_sites_para)
    {
    init();
    ...
    } 
    
    //Private
    void classification::init() {
    //Konstruktor Code
    }
    


  • du must leider den ganzen Schmuh nochmal schreiben. verschachtelte constructoren gibts leider erst mit dem nächsten standard.

    //edit Storms lösung is besser



  • und bei vererbung immer daran denke, dass polymorphie in ctors nicht greifen kann... d.h. wenn du in deiner basisklasse ein virtuelles init aufrufet und du in deiner speziellen klasse dieses überschrieben hast, so musst du es im ctor der speziellen klassen ebenfalls aufrufen (liegt, daran, dass die basisklasse zuerst im speicher initialisiert wird und somit von der spezielleren klasse noch nichts "weiß"

    so long,
    sirann



  • otze schrieb:

    du must leider den ganzen Schmuh nochmal schreiben. verschachtelte constructoren gibts leider erst mit dem nächsten standard.

    Im VC++ 2008 geht es! 👍



  • wirklich? wie?

    ich hab mich das nämlich auch schon gefragt, im moment verwende ich auch private member methoden die den teil der bei 2 konstruktoren gleich ist erledigen



  • also wenn dein code sowas wie portabel sein soll,d ann solltest du dringlichst erstmal drauf verzichten! das VS schluckt ziemlich viel, was fernab jeden standards ist!!



  • muffmolch schrieb:

    also wenn dein code sowas wie portabel sein soll,d ann solltest du dringlichst erstmal drauf verzichten! das VS schluckt ziemlich viel, was fernab jeden standards ist!!

    Ja, zum Glück wird es Teil des nächsten Standard sein. 🙂


Anmelden zum Antworten