Ü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 }; #endifCPP 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 Feldpublic:
// Standartkonstruktor
Chefin();// Konstruktor
Chefin(const Sekretaer& sekretaer, char* bereich = " ");void sekretaerAendern(Sekretaer* neuerSekretaer); //Sekretaer aendern
};
#endif1. 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