Programmierstil Konstruktor/Destruktor
-
Hallo Leute,
habe eine kurze Frage und zwar gilt es in C++ als schöner Stil, wenn man stets die Prototypen des Standardkonstruktors und des Destruktors in der Klassendeklaration angibt, auch wenn diese evtl. nichts explizites tun und somit in der .cpp nicht näher definiert werden?
Gruß und schönes Wochenende

-
Nein, Pfui Teufel!
-
314159265358979 schrieb:
Nein, Pfui Teufel!
Und wer dich kennt, sieht in dem Beitrag schon wieder den Wunsch nach einem Flame

Einfach ohne Begründung rummotzen...Also:
Es ist schlecht, das zu deklarieren, da damit dem Compiler signalisiert wird "mach ich selber" und er nichts automatisch generiert. Damit bist du in der Pflicht, die Implementierung abzuliefern, auch wenn du nichts explizites darin tust. Du bekommst dann beim Linken eine undefined reference.
Das ist also keine Stilfrage, da Stil erst dann was bringt, wenn das erreichte korrekt ist.BTW.:
In einer KlassenDEKLARATION kann man keine Funktionen angeben, das geht nur in der KlassenDEFINITION.
Und dann noch der obligatorische Hinweis auf C++11: hier geht die Deklaration ohne Definition SEHR WOHL und ist in gewissen Fällen sogar nötig! Siehe Schlüsselwörter "default und delete". (wundert mich, dass das PI jetzt nicht gebracht hat...)
-
Danke für deine Antwort und Sorry für das Durcheinanderhauen der Begriffe, hab nicht gut nachgedacht

Wäre es demnach besser Konstruktor und Destruktor in der Klassendefinition komplett zu ignorieren oder sollte man so etwas machen wie:
class A { public: A() {} ~A() {} };bzw.
// A.h class A { public: A(); ~A(); }; // A.cpp A::A(){} A::~A(){}Und noch eine kurze Frage zu deinem Hinweis am Ende, kann nicht auch in den älteren C++ Standards (also vor dem 2011) Klassendeklaration und Klassendefinition trennen, also so z.B. so etwas machen wie:
class A; // hier passiert etwas mit class A ... class A { // Definition der Klasse A };Habe es gerade getestet, indem ich in der main-Funktion A einfach nur instantiere:
class A; int main() { A a; } class A { // Definition der Klasse A };was problemlos klappt, jedoch funktioniert so etwas nicht:
class A; class B : public A {...} // hier passiert wieder etwas class A { // Definition der Klasse A };Weißt du evtl. wie hier die Regel ist?
Gruß

-
die vererbte klasse muss schon vollständig bekannt sein
greetz KN4CK3R
-
MatheStein schrieb:
Habe es gerade getestet, indem ich in der main-Funktion A einfach nur instantiere:
class A; int main() { A a; } class A { // Definition der Klasse A };was problemlos klappt, jedoch funktioniert so etwas nicht:
Ich weiss nicht wie du das getestet hast, aber das geht so eben nicht. In main() ist ja nichts über die Klasse A bekannt, also kann man sie auch nicht instanzieren. Könnte ja sein dass A keinen öffentlichen Konstruktor hat der ohne Parameter auskommt, oder der Destruktor private ist oder was auch immer.
prog.cpp: In function ‘int main()’: prog.cpp:5: error: aggregate ‘A a’ has incomplete type and cannot be defined prog.cpp:5: warning: unused variable ‘a’
-
Danke für deine Antwort, keine Ahnung was ich da vorhin gemacht, jetzt bekomme ich auch einen Fehler

Gruß
