Konstruktor mit Parametern ohne Parameter aufrufen? C++



  • Hallo Leute,
    ich hänge momentan an folgender Aufgabe:
    "Implementieren Sie den Konstruktor so, dass der parameterfreie Konstruktor überflüssig wird"

    Klasse:

    class Vector3D {
      float x, y, z;
    public:
      Vector3D(float a, float b, float c) {
        x = a; y = b; z = c;
      }
      Vector3D() {
        x=0; y=0; z=0;
      }
    };
    

    Hierbei habe ich mir gedacht, dass ich dem Konstruktor Vektor3D(float a,....) einfach schon Standardwerte(0) mitgebe. Das würde dann so aussehen:

    Vector3D::Vector3D(const float a = 0, const float b = 0, const float c = 0){
    	x = a; y = b; z = c;
    }
    

    Doch wenn ich jetzt den Vektor3D(const float a = 0,..... in der main aufrufe, dann ruft der Compiler überhaupt nicht diesen Konstruktor auf 😕

    Meine main:

    int main()
    {
    	Vector3D a ();
            return 0;
    }
    

    Was mache ich falsch?!? ich hoffe ihr könnt mir dabei weiterhelfen 😉



  • Vector3D a ();
    

    Das ist eine Funktion a die Vector3D als Rückgabewert hat. Mehr gibts nicht als Hinweis 😃



  • out schrieb:

    Das ist eine Funktion a die Vector3D als Rückgabewert hat. Mehr gibts nicht als Hinweis 😃

    Ich setz' noch einen drauf, damit es sich gezielter recherchieren lässt:
    Es hat sich dafür der Ausdruck Most vexing parse eingebürgert (Scott Meyers, Effective STL).



  • es gibt bei C++ keine notation in der der default ctor mit () aufgerufen wird wie bei Java. Entweder du lässt die Klammern weg oder benutzt "uniform-initialization" style also

    3DVector vec{};
    

    btw. du solltest für deinen ctor initialization lists benutzen, anstelle der zuweisungen im Funktionsrumpf



  • Sewing schrieb:

    es gibt bei C++ keine notation in der der default ctor mit () aufgerufen wird wie bei Java.

    😕

    new Foo();
    

    C++ oder Java?

    Du meinst wahrscheinlich das richtige, aber so wie du es geschrieben hast ist es mMn. falsch. Denn die Schreibweise

    Klasse variable(initArgument1, initArgument2, initArgument3);
    

    gibt es in Java soweit ich weiss gar nicht. Und die syntaktischen Konstrukte die ich aus Java kenne wo man einen Konstruktor mit () aufruft funktionieren in C++ ebenso.

    Falls das Unsinn ist, und mich hier meine super-löchrigen Java-Kenntnisse im Stich gelassen haben, bitte ich um Korrektur.

    ps: Andere Beispiele wo man in C++ den default-ctor mit () aufruft (die allerdings alle in Java wegen des fehlenden new nicht funktionieren):

    functionTakingAFoo(Foo());
    Foo().fooMemberFunction();
    Foo f = Foo() + Foo();
    Foo f = Foo();
    ...
    

Log in to reply