Konstruktor Problem





  • miller_m schrieb:

    http://www.cpp-tutor.de/cpp/le12/le12_03.htm#mehrfach

    OK, ich lese mich nochmals durch. Danke für die Geduld!

    Viele Grüße
    Jorgo



  • Geht auch per default-Parameter - etwa so:

    PERSON::PERSON (const char *szName,
                    const char *szFirstName = NULL,
                    const char  iAge = (-1))
    {
        bool    fSuccess;
    
        SetDefaultValues ();            //Noch zu schreiben!
    
        fSuccess = SetName (szName);    //Noch zu schreiben!
    
        if ((fSuccess == true) && (szFirstName != NULL))
            fSuccess = SetFirstName (szFirstName) //Noch zu schreiben!
    
        if ((fSuccess == true) && (iAge > 0))
            fSuccess = SetAge (iAge);   //Noch zu schreiben!
    
        if (fSuccess == false)
            throw (1);                 //Nummer/Mssg/Type 
                                       //(statt 1) noch definieren! 
    }
    


  • Wir sind hier in nem C++-Forum 🙄



  • ... schrieb:

    Wir sind hier in nem C++-Forum 🙄

    Das stimmt, aber manchmal ist es sinnvoll, einen NULL-Pointer als Marker fuer etwas zu nehmen. Die Transformation in die std::string-Klasse kann dann in den Set-Methoden erfolgen. Wo "C-Style" angemessen oder einfach schneller oder einfacher nehme ich ihn auch.



  • MBCS-CITP schrieb:

    Geht auch per default-Parameter - etwa so:

    PERSON::PERSON (const char *szName,
                    const char *szFirstName = NULL,
                    const char  iAge = (-1))
    {
        bool    fSuccess;
    
        SetDefaultValues ();            //Noch zu schreiben!
    
        fSuccess = SetName (szName);    //Noch zu schreiben!
    
        if ((fSuccess == true) && (szFirstName != NULL))
            fSuccess = SetFirstName (szFirstName) //Noch zu schreiben!
    
        if ((fSuccess == true) && (iAge > 0))
            fSuccess = SetAge (iAge);   //Noch zu schreiben!
    
        if (fSuccess == false)
            throw (1);                 //Nummer/Mssg/Type 
                                       //(statt 1) noch definieren! 
    }
    

    ahh...lol...sorry...is mir nur so rausgerutscht

    PERSON::PERSON (const std::string& name,
                    const std::string& vorname=std::string(),
                    const char  alter = 0)
                    :name(name),vorname(vorname),alter(alter)
    

    so von wegen schneller...

    @Jorgo das ist so nicht ohne weitere möglich-zumindest nicht mit dem zuweisungsoperator. Der zuweisungsoperator ist dazu da, komplett zu kopieren, und nicht nur Teilstücke. Wär ja fast so, wie wenn dir beim zuweisen von int werten nur das erste Bit kopiert werden würde 😃

    wenn du aber zb nur den namen doer nur das alter kopieren willst, kannst du natürlich auch funktionen für sowas schreiben:

    PERSON p("Mueller");
    PERSON q("Bla");
    
    p.setVorname("Peter");
    p.setAlter(33);
    
    q.setVorname(p.getVorname());
    q.setAlter(p.getAlter());
    


  • @otze

    Nur muss man zwischen zwei Dingen unterscheiden: Zwischen einem nicht gesetzten Datentyp und einem leeren: Es ist ein Unterchied, ob ich einen String vom Default Konstruktor der Stringklasse, der leer ist (also nur ein End-of-String") enthalte oder ob ich den entsprenden Wert garnicht gesetzt habe. Dies kann man am einfachsten einen NULL-Pointer setzen. Ansosnten haette ich dort keine Moeglichkeit, ausser einem Extra-Flag.



  • MBCS-CITP schrieb:

    @otze

    Nur muss man zwischen zwei Dingen unterscheiden: Zwischen einem nicht gesetzten Datentyp und einem leeren: Es ist ein Unterchied, ob ich einen String vom Default Konstruktor der Stringklasse, der leer ist (also nur ein End-of-String") enthalte oder ob ich den entsprenden Wert garnicht gesetzt habe. Dies kann man am einfachsten einen NULL-Pointer setzen. Ansosnten haette ich dort keine Moeglichkeit, ausser einem Extra-Flag.

    was ist NULL sonst ?

    void myfunc(int i){cout << i << endl;}
    void myfunc(void* vp){cout << "void pointer" << endl;}
    ...
    myfunc(NULL);
    

    Na was wird aufgerufen ? 🙄



  • MBCS-CITP schrieb:

    @otze

    Nur muss man zwischen zwei Dingen unterscheiden: Zwischen einem nicht gesetzten Datentyp und einem leeren: Es ist ein Unterchied, ob ich einen String vom Default Konstruktor der Stringklasse, der leer ist (also nur ein End-of-String") enthalte oder ob ich den entsprenden Wert garnicht gesetzt habe.

    es gibt in C++ keinen leeren Datentyp. du hast auch nicht die möglichkeit eine variable nicht zu setzen, da immer zuerst der default-ctor aufgerufen wird. Das Ergebnis kann zwar undefiniert sein, wie zb bei integer werten, die zu dem zeitpunkt jeden wert haben können, aber der default ctor wird aufgerufen.
    Ausnahme ist natürlich, du benutzt eine initialisierungsliste, dann wird der default ctor durch den ersetzt, den du in der initialisierungsliste angegeben hast.



  • otze schrieb:

    es gibt in C++ keinen leeren Datentyp. du hast auch nicht die möglichkeit eine variable nicht zu setzen, da immer zuerst der default-ctor aufgerufen wird.

    Das ist das Problem. Deshalb habe ich angewoehnt, grundsaetzlich in solchen Faellen Memberklassen nur als Pointer zu einer Instanz der Klasse auftauchen zu lassen, die im Default-Konsturktor auf NULL gesetzt wird und ggf. waerend der Lebenszeit des Objects durch einen new-Operator der Memberklasse mit "Leben" gefuellt wird.



  • MBCS-CITP schrieb:

    ...und ggf. waerend der Lebenszeit des Objects durch einen new-Operator der Memberklasse mit "Leben" gefuellt wird.

    Womit Du dann völlig am Sinn eines Konstruktors vorbeischießt. Zumal Du automatic storage und alle Vorteile die sie mitbringt einfach in den Wind schießt. Ich hoffe, Du willst nicht sagen, dass die Performance einer Klasse "Person" eine wesentliche Rolle spielt... falls sie das jemals tun sollte, kann man hier immernoch später optimieren und solange die einfache und sichere Variante benutzen.

    Durch die 0-Zeiger handelst Du dir dann auch noch eine mehrwertige Logik ein, die es speziell zu handlen gilt. Wenn man sich schon für so triviale Klassen dermaßen den Kopf zerbrechen muss, na dann gute Nacht.

    Zum eigentlichen Problem: Ist der Zuweisungsoperator nicht überflüssig? Der Compiler-generierte sollte doch (zumindest noch) alles richtig machen...


Anmelden zum Antworten