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 compilation
    

    Der 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??! 😕


Anmelden zum Antworten