kann ich ohne Konstruktor kein Objekt definieren?



  • hi, ich habe noch eine Frage zu der DVD C++ Einstieg für Anspruchsvolle von Video2Brain.

    Hier sagt der Autor das er einen leeren Kontruktor deklarieren muss damit man später Objekte definieren kann, obwohl er schon einen Kontruktor mit Parametern hat. Muss man immer einen Konstruktor ohne Parameter deklarieren auch wenn man schon einen hat?

    Also hier mal in Code

    class myclass{
    .
    .
    public:
        myclass() {} // muss man den machen?
        myclass(int i, int j){ // wenn man den hat?
          ....
        }
    
    .
    .
    };
    


  • derjunge schrieb:

    hi, ich habe noch eine Frage zu der DVD C++ Einstieg für Anspruchsvolle von Video2Brain.

    Hier sagt der Autor das er einen leeren Kontruktor deklarieren muss damit man später Objekte definieren kann, obwohl er schon einen Kontruktor mit Parametern hat. Muss man immer einen Konstruktor ohne Parameter deklarieren auch wenn man schon einen hat?

    Also hier mal in Code

    class myclass{
    .
    .
    public:
        myclass() {} // muss man den machen?
        myclass(int i, int j){ // wenn man den hat?
          ....
        }
        
    .
    .
    };
    

    Nein.

    a)

    class myclass{
    public:
        myclass() {}
        myclass(int i, int j){...} 
    };
    ...
    myclass m1;//geht
    myclass m2(1,1);//geht
    

    b)

    class myclass{
    public:
        myclass() {}
    };
    ...
    myclass m1;//geht
    myclass m2(1,1);//geht nicht
    

    c)

    class myclass{
    public:
        myclass(int i, int j){...} 
    };
    ...
    myclass m1;//geht nicht
    myclass m2(1,1);//geht
    

    d)

    class myclass{
    public:
    };
    ...
    myclass m1;//geht
    myclass m2(1,1);//geht nicht
    

    in d) wird der Konstruktor mit ohne ARgumente, der nichts tut, vom Compiler selber gemacht. Aber sobald Du einen eigenen anbietest, wird der nicht von selber gemacht und Du hast Fall c).
    Normalerweise bleibe ich bei c) stehen und gehe nicht weiter zu Fall a), denn das führt meistens zu nicht gerade sinnvoll konstruierten Objekten. Leider muß man zu a) gehen, wenn man so Objekte in ein Array stopfen will. Wird aber besser mit c++0x und ich vermute, a) wird in den kommenden Jahren immer unbeliebter. Außer natürlich für Klassen, wo das keinem Weh tut, und a) richtig sinnvoll ist. Also Vector bekommt natürlich a), aber Datei bekommt nur c).



  • Der Vollständigkeit halber 🙂
    e)

    class myclass{
    public:
        myclass(int i, int j=0){...}
    };
    ...
    myclass m1;//geht nicht
    myclass m2(1);//geht (i==1, j==0)
    myclass m3(1,1);//geht (i==1, j==1)
    

    f)

    class myclass{
    public:
        myclass(int i=0, int j=0){...}
    };
    ...
    myclass m1;//geht (i==0, j==0)
    myclass m2(1);//geht (i==1, j==0)
    myclass m2(1,1);//geht (i==1, j==1)
    

Anmelden zum Antworten