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
, sondernPUNKT_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!