no appropriate default constructor available
-
Hallo,
ich hab ein kleines Problem und zwar hab ich folgenden Quelltext:
[code] #include <iostream> #include <string> using namespace std; class B1 { public: B1(){}; }; // K1 abgeleitet von B1 class K1:public B1 { private: double a,b; public: K1(double x, double y){a=x; b=y;}; }; // D1 abgeleitet von K1 class D1:public K1 { private: double a,b; public: D1(double x, double y){a=x; b=y;}; };Wenn ich diesen Quelltext kompiliere bringt der
Compiler folgende Fehlermeldung:
"error C2512: 'K1' : no appropriate default constructor available"!Woran liegt das?
Vielen Dank schon im Vorraus!
-
Sobald du einen Konstruktor definierst, der Argumente enthält, erzeugt der Compiler für dich keinen Default-Konstruktor (der ohne Parameter) mehr.
Das ist weiter nicht tragisch - solange du ihn nicht verwendest
Und das ist bei dir wahrscheinlich das Problem, dass du irgendwoK1 k;machst...
-
tandem schrieb:
Sobald du einen Konstruktor definierst, der Argumente enthält, erzeugt der Compiler für dich keinen Default-Konstruktor (der ohne Parameter) mehr.
Das ist weiter nicht tragisch - solange du ihn nicht verwendest
Und das ist bei dir wahrscheinlich das Problem, dass du irgendwoK1 k;machst...
naja - so ähnlich ^^
in zeile 29 im geposteten ist das problem...allerdings erschließt sich mir die vererbungsstruktur noch nicht so ganz - also deren sinn

@Andi erklär ma bitte, wozu du die jeweilige Klasse brauchst, dann sagen wir dir dazu noch, warum man es so nicht macht und wie man es besser macht auch, wenn du dich gut anstellst
bb
-
Ich fände es auch gut, wenn der OP mal was über Initialisierungslisten liest.
-
unskilled schrieb:
naja - so ähnlich ^^
in zeile 29 im geposteten ist das problem...Stimmt, thx

Hab das "D1:public K1" wegen dem dicken Kommentar drüber net so genau erfasst...
-
Der Sinn besteht darin:
Die Klasse "B1" soll als abstrakte Klasse/ Schnittstelle dienen,
die nur rein virtuelle Funktionen enthält.
Als Beispiel entspricht Klasse "B1" allen Tieren.In Klasse "K1" wiederum sollen die virtuellen Funktionen überschrieben werden.
Die Klasse "K1" entspricht z.B. Landtiere, "K2" würde Wassertiere entsprechen.
Soweit so gut funktioniert auch alles.Schließlich soll von "K1" noch eine weitere Klasse "D1" abgeleitet werden,
die wiederum die Funktionen von "K1" überschreibt. "K1" würde z.B. den Landtieren Vierbeiner entsprechen.
Dort liegt das Problem beim Anlegen des Konstruktors von "K1".
Wenn ich in "K1" einen Default-Konstruktor K1() anlege, bekomme ich zwar nicht den o.g. Fehler. Jedoch einen Linker-Fehler "unresolved externals".Ich hoffe ich konnte den Sinn der Klassenhierachie soweit deutlich machen!
-
#include <iostream> #include <string> using namespace std; class B1 { public: B1() {} //die zeile kann man auch weglassen, weil der compiler nichts anderes als das generiert ^^ virtual ~B1() {} }; /* Die Klasse "B1" soll als abstrakte Klasse/ Schnittstelle dienen, die nur rein virtuelle Funktionen enthält. Als Beispiel entspricht Klasse "B1" allen Tieren. es soll also auch so etwas gehen: B1* tmp = new Derivded(...); //... delete tmp; */ /* und da wir faul sind, wollen wir ja so wenig wie möglich tippen: struct B1 { virtual ~B1() {} }; bzw. struct B1 { virtual ~B1() = 0; }; weil man ja idR keine Instanz von dieser Klasse anlegen soll... */ // K1 abgeleitet von B1 class K1 : public B1 { private: double a,b; // bemerke: standard-ctor ist nicht generiert worden, da wir einen anderen implementiert hatten... public: K1(double x, double y) : B1() //standard-ctor aufruf der basisklasse - das hier nent sich übrigens initialisierungsliste... {a=x; b=y;} double GetA() const { return a; } //getter double GetB() const { return b; } //getter //evtl setter... }; // D1 abgeleitet von K1 class D1 : public K1 { private: // double a,b; hast du in der basisklasse doch schon... public: D1(double x, double y) : K1(x, y) //Ctor (mit Parametern) aus K1 aufrufen {} };bb
edit: Hinweise zu B1 hinzugefügt...
-
Es funktioniert so!
Und das Wichtigste, ich hab auch verstanden warum!Vielen Dank für die schnelle und gute Hilfe!