Konstruktorliste



  • Hi Leute,

    ich bekomme mit folgendes Konstruktorliste immer eine Warnung von Visual Studio ausgegeben:

    #include<iostream>
    #include"test2.h"
    
    int main()
    {
    	Punkt p1();
    
    return 0;
    }
    
    #ifndef PUNKT__H
    #define PUNKT__H
    
    class Punkt
    {
    public:
    	int x;
    	int y;
    
    	Punkt();	
    	~Punkt();
    };
    
    #endif PUNKT__H
    
    #include"test2.h"
    
    Punkt::Punkt() : x(0), y(0)
    {
    
    }
    

    Ehrlich gesagt wusste ich nicht, wie ich den Code besser eingrenzen sollte... Vielleicht könnt ihr mir ja helfen 🙂



    Punkt p1; // und nicht Punkt p1(), weil das eine Funktionsdeklaration ist.
    

    2. Nicht PUNKT__H , sondern PUNKT_H .

    Each name that contains a double underscore _ _ or begins with an underscore followed by an uppercase letter (2.12) is reserved to the implementation for any use.



  • vip@r schrieb:

    #include<iostream>
    #include"test2.h"
    
    int main()
    {
    	Punkt p1();
    }
    

    Deklariert einer Funktion, die einen Punkt zurücklierfert. Du musst die Klammern weglassen.

    Es wäre vielleicht sinnvoll die Warnung anzugeben, wenn du dich schon darauf beziehst.



  • Wenn ich die Klammer von p1 weglasse, dann kompiliert mir das Projekt gar nicht mehr. Ich bekomme dann einen Linker Error.

    Die Warnung auf die ich mich bezogen haben lautet:

    Warnung	1	warning C4930: 'Punkt p1(void)': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)
    

    Edit: Hab den Fehler mit Linker-Error selbst gefunden. Ich war zu blöd um zu erkennen, dass ich auch den Destruktor in die Implementierungsdatei schreiben sollte!



  • So, jetzt hab ich eine letzt Frage:

    Was ist der Unterschied zwischen dem auskommentierten Konstruktor mit vorgegebenen Anfangswerten, und dem einkommentierten Konstruktor, der die Anfangswerte über den Konstruktor weiterleitet? Mein Lehrbuch schweigt sich über die Vor- und Nachteile beider Möglichkeiten leider aus und ich erkenne duch eingehendes Debuggen leider auch keinen Unterschied! Könnt ihr mir den Unterschied erklären?

    #include"test2.h"
    
    int main()
    {
    	//Punkt p1;
    	Punkt p1(0,0);
    
    	p1.x;
    	p1.y;
    
    return 0;
    }
    
    #ifndef PUNKT_H
    #define PUNKT_H
    
    class Punkt
    {
    public:
    	int x;
    	int y;
    
    	//Punkt();
    	Punkt(int _x, int _y);
    
    	~Punkt();
    };
    
    #endif PUNKT_H
    
    #include"test2.h"
    
    //Punkt::Punkt() : x(0), y(0)
    //{
    //
    //}
    
    Punkt::Punkt(int _x, int _y) : x(_x), y(_y)
    {
    
    }
    
    Punkt::~Punkt()
    {
    
    }
    


  • Mit dem Standard Konstruktor initialisiert Objekte können erstmal nur den Wert(0,0) haben.
    Mit dem (int,int) Konstruktor aber z.B. auch (5,5) d.h.,dass die Objekte sofort mit Werten initialisiert werden.

    Anstatt

    Punkt::~Punkt()
    {
    
    }
    

    kannst du auch einfach

    class Punkt
    {
    public:
        int x;
        int y;
    
        //Punkt();
        Punkt(int _x, int _y);
    
        ~Punkt()=default;
    };
    

    Schreiben oder den Destruktor gleich weglassen.



  • Danke, für eure Hilfe! Die hat mir sehr geholfen!


Anmelden zum Antworten