Überladene Funktionen bei Vererbung



  • Hallo Leute!

    Ich hab ein riesen Problem, ich soll diese Aufgabe lösen: http://u20563.hs-harz.de/Aufgabe3.pdf

    So weit so gut, den Sekretaer hab ich komplett fertig, nur die Chefin macht mir Probleme, irgendwas stimmt mit den überladenen Funktionen nicht, aber ich hab keinen Plan wie ich es anders machen kann. Hoffe ihr könnt mir helfen.

    Header Datei:

    class Chefin : protected Mitarbeiter {
    
    	private:
    
    		const Sekretaer* _sekretaer;
    		Mitarbeiter _mitarbeiter;
    		char bereich[laenge+1]; //Deklaration des Bereichs als Char Feld
    
    	public:
    
    		// Standartkonstruktor
    		Chefin();
    
    		// Konstruktor
    		Chefin(const Sekretaer& sekretaer, char* bereich = " "); 
    
    		void sekretaerAendern(Sekretaer* neuerSekretaer); //Sekretaer aendern
    
    };
    #endif
    

    CPP Datei:

    //Standartkonstruktor
    Chefin::Chefin(){}
    
    //Konstruktor
    Chefin::Chefin(const Sekretaer& sekretaer, char* bereich) : Mitarbeiter(_adresse, personalNr, gehalt) {
    
    	bereichAendern(bereich); //neuen Bereich zuweisen
    	_sekretaer = &sekretaer;
    
    }
    
    void Chefin::sekretaerAendern(Sekretaer* neuerSekretaer) {
    
    	_sekretaer = neuerSekretaer;
    }
    

    Folgende Fehlermeldungen gibt er mir bei dieser Testdatei aus (Fehlerpositionen Fett hervorgehoben):

    int main(void)
    {
    	Sekretaer
    		sekr1(Adresse("Stein", 38855L, "Darlingerode"), 7, 3000, "Englisch");
    	Chefin chefin1(sekr1, Adresse("Baur", 38855L, "Reddeber"),17, 6700, "Vertrieb");
    	chefin1.sekretaerAendern(sekr2);
            chefin1.sekretaerAendern();
    	chefin1.sekretaerAendern(sekr1);
    
    	Chefin chefin2(Adresse("Mueller", 38640L, "Goslar"),
    								 21, 9500, "EDV");
    
    }
    

    c:\dokumente und einstellungen\juliane\eigene dateien\oop\projekt-firma\src\tsc.cpp(26) : error C2661: 'Sekretaer::Sekretaer': Keine überladene Funktion akzeptiert 4 Argumente
    c:\dokumente und einstellungen\juliane\eigene dateien\oop\projekt-firma\src\tsc.cpp(34) : error C2661: 'Chefin::Chefin': Keine überladene Funktion akzeptiert 5 Argumente
    c:\dokumente und einstellungen\juliane\eigene dateien\oop\projekt-firma\src\tsc.cpp(43) : error C2664: 'Chefin::sekretaerAendern': Konvertierung des Parameters 1 von 'Sekretaer' in 'Sekretaer *' nicht möglich
    Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
    c:\dokumente und einstellungen\juliane\eigene dateien\oop\projekt-firma\src\tsc.cpp(47) : error C2660: 'Chefin::sekretaerAendern': Funktion akzeptiert keine 0 Argumente
    c:\dokumente und einstellungen\juliane\eigene dateien\oop\projekt-firma\src\tsc.cpp(49) : error C2664: 'Chefin::sekretaerAendern': Konvertierung des Parameters 1 von 'Sekretaer' in 'Sekretaer *' nicht möglich
    Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
    c:\dokumente und einstellungen\juliane\eigene dateien\oop\projekt-firma\src\tsc.cpp(56) : error C2661: 'Chefin::Chefin': Keine überladene Funktion akzeptiert 4 Argumente



  • Hi,
    grenze bitte den Code in die Fehlerstellen und die fehler-relevanten Stellen ein.
    Das erspart manchen Leuten ein paar Gehirnzellen 😉



  • Beim drüberfliegen ist mir schonmal das aufgefallen, denke mal hast du an anderen Stellen auch falsch:

    //Konstruktor
    Chefin::Chefin(const Sekretaer& sekretaer, char* bereich) : Mitarbeiter(_adresse, personalNr, gehalt) {
    
        bereichAendern(bereich); //neuen Bereich zuweisen
        _sekretaer = &sekretaer;
    
    }
    

    Du musst das so machen:

    class A {
       public:
              A(int z,bool b) { }
    };
    
    class B : public A {
       public:
              B(int lu,string a,int z, bool b):A(z,b) { }
    };
    

    D.h., die Argumenten die du an deine Basisklasse übergeben mächstest, müssen auch als Parameter in der Parameterliste des Konstruktors der abgeleiteten Klasse stehen.

    B nimmt sie auf und gibt sie an A's Konstruktor weiter 😉

    Und C/C++ Tags benutzen 😉 ( direkt neben Code )



  • Also ich habe den Konstruktor in dem Header jetzt geändert in:

    // Konstruktor
    Chefin(const Sekretaer& sekretaer, char* bereich = " ") : Mitarbeiter(Adresse(),personalNr,gehalt){}
    

    Aber ich muss jetzt doch den Konstruktor in der Cpp doch auch noch ändern, weil er hat doch jetzt zwei Funkionen ...



  • MilchMaedchen schrieb:

    Also ich habe den Konstruktor in dem Header jetzt geändert in:

    // Konstruktor
    Chefin(const Sekretaer& sekretaer, char* bereich = " ") : Mitarbeiter(Adresse(),personalNr,gehalt){}
    

    Aber ich muss jetzt doch den Konstruktor in der Cpp doch auch noch ändern, weil er hat doch jetzt zwei Funkionen ...

    Natürlich musst du den Code zwischen Deklaration und Definition gleichhalten (Für jede Methoden-Deklaration ist auch eine Definition nötig). Aber ein anderer Fehler ist immer noch drinne der dir oben schon gesagt wurde:

    Chefin(const Sekretaer& sekretaer, char* bereich = " ") : Mitarbeiter(Adresse(),personalNr,gehalt){}

    Hier übergibst du ein Objekt "sekretaer" und einen "bereich", rufst aber den Konstrutor der Basisklasse mit unbekannten Werten auf. Adresse()=> Okay leerer Konstruktor (ob das gewünscht ist, ist eine andere Frage), Wo aber wird in der Übergabe personalNr und gehalt definiert?

    Da mir hier jetzt zuviele Codefragmente fehlen kann ich nur rätseln was du damit machen willst, falsch ist es aber egal wie.

    cu André



  • class Chefin : protected Mitarbeiter {

    private:

    const Sekretaer* _sekretaer;
    Mitarbeiter _mitarbeiter;
    char bereich[laenge+1]; //Deklaration des Bereichs als Char Feld

    public:

    // Standartkonstruktor
    Chefin();

    // Konstruktor
    Chefin(const Sekretaer& sekretaer, char* bereich = " ");

    void sekretaerAendern(Sekretaer* neuerSekretaer); //Sekretaer aendern

    };
    #endif

    1. wieso _sekretaer ist aggregation, _mitarbeiter ist composition(besser die beiden siend aggregation).
    2.

    Chefin(const Sekretaer& sekretaer, char* bereich = " ");

    sekretaer ist const, und const Sekretaer* _sekretaer wie kannst du nachher per sekretaerAendern das durchführen.

    Chefin::Chefin(const Sekretaer& sekretaer, char* bereich) : Mitarbeiter(_adresse, personalNr, gehalt) {

    bereichAendern(bereich); //neuen Bereich zuweisen
    _sekretaer = &sekretaer;

    }

    was ist const Sekretaer& sekretaer, es ist ein const reference, weil du vorher in class const Sekretaer* _sekretaer; definiert hast , deswegen _sekretaer = &sekretaer? es ist gleich wie

    class ...
    {
    ...
    const Sekretaer* _sekretaer;
    };
    
    Chefin::Chefin(const Sekretaer*& sekretaer, char* bereich) : Mitarbeiter(_adresse, personalNr, gehalt) {
    
        bereichAendern(bereich); //neuen Bereich zuweisen
        _sekretaer = sekretaer;
    }
    

    aber sekretaer ist const, macht keinen Sinn


Anmelden zum Antworten