Programm lässt sich nicht kompilieren
-
Hallo,
ich versuche gerade mit Pattern zu arbeiten leider lässt sich mein Programmcode nicht komplieren, diesen Fehler bekomme ich
[code] error C2512: 'Manager' : no appropriate default constructor available error C1903: unable to recover from previous error(s); stopping compilationDer ganze Quelltext steht in einer Datei (ich weiß nicht gerade die feine Art)
main.cpp
class Employee; class Manager; class Engineer; class EmployeeType { public: virtual int payAmount(Employee e)=0; }; class Employee { public: Employee():_type(new Manager()){}; int getGehalt(){ return gehalt; }; int getBonus(){ return bonus; }; int payAmount(){ return _type->payAmount(*this); }; private: int gehalt; int bonus; EmployeeType *_type; }; class Manager : public EmployeeType { public: virtual int payAmount(Employee e) { return e.getGehalt()+e.getBonus(); }; }; class Engineer : public EmployeeType { virtual int payAmount(Employee e) { return e.getGehalt(); }; }; int main() { return 0; }Kennt jemand die Lösung??
Bin am verzweifeln.:(mfg:)
-
Also das liegt am Konstructor von Employee. Er brauch für new Manager die ganze Definition von class Manager. Lösung: Schön machen und die Definitionen in den Header oder Employee-Konstructor unter Manager Deklarieren:
class Employee; class Manager; class Engineer; class EmployeeType { public: virtual int payAmount(Employee e)=0; }; class Employee { public: Employee(); int getGehalt(){ return gehalt; }; int getBonus(){ return bonus; }; int payAmount(){ return _type->payAmount(*this); }; private: int gehalt; int bonus; EmployeeType *_type; }; class Manager : public EmployeeType { public: virtual int payAmount(Employee e) { return e.getGehalt()+e.getBonus(); }; }; class Engineer : public EmployeeType { virtual int payAmount(Employee e) { return e.getGehalt(); }; }; Employee::Employee() : _type( new Manager() ) {} int main() { return 0; }
-
Du hast einen Zirkelschluß in deinem Code.
Du greifst bei 'Employee():_type(new Manager()){};' schon auf die noch nicht vollständig definierte Klasse 'Manager' zu.
Du mußt entweder die Manager-Klasse vor die Employee-Klasse schreiben oder alternativ die Definition des Employee-Konstruktors nach der Manager-Klasse (die Deklaration bleibt natürlich in der Klasse).
Und wie du schon erkannt hast, solltest du die Trennung von Source- und Headerdateien durchführen (dann treten zwar solche Fehler häufiger auf, aber mit der Zeit kriegst du dann raus, wie man es richtig macht - du hast zwar schon die Vorwärtsreferenzen (Forward references) verwendet, aber hier bringen die nichts, nur wenn man Deklarationen der Form T* oder T& verwendet).
P.S. Die Deklaration 'payAmount(Employee e)=0;' solltest du zu
virtual int payAmount(const Employee &e) = 0;ändern (da bei dir sonst bei der Übergabe immer erst eine Kopie erstellt wird (by value)).
-
Ja jetzt klappt es.
Vielen Dank:)
-
Welcher Compiler gibt denn so eine miserable Meldung aus??!
