Hilfe, Compilerfehler
-
Hallo,
ich bekomme bei meinem Programm folgende Fehler:
Error 1 error LNK2005: "public: void __thiscall Laeufer::anlegen(void)" (?anlegen@Laeufer@@QAEXXZ) already defined in Laeufer.obj Vereinslaeufer.obj
Error 2 error LNK2019: unresolved external symbol "public: void __thiscall Vereinslaeufer::anlegen(void)" (?anlegen@Vereinslaeufer@@QAEXXZ) referenced in function _main Main.obj
Error 3 fatal error LNK1120: 1 unresolved externals C:\studium\anderes\programmieren\kompaktkurs c++\1\cpp2\crosslauf psta1\Release\crosslauf.exe 1Googlesuche hat mich nicht weitergebracht. Kann mir bitte jemand helfen?
Gerne texte ich auch quellcode, wenn gewünscht.Beste Grüße
-
Ohne Code kann man wirklich nur raten:
1. Entweder vergessene Inkludeguards oder vielleicht ein Copy-PasteFehler und die Methode existiert zweimal...
2. Auf letzteres würde deuten, das er hier keine Methode "Vereinslaeufer::anlegen" gefunden hat (Wirklich in cpp/h die richtigen Bezeichner gewählt?cu André
P.S: Ein Code der soweit gekürzt wurde das der Fehler noch auftritt ist meist mehr als sinnvoll...
-
Hallo André,
danke für die antwort.
An die includeguards hab ich gedacht. Es handelt sich um ein Vererbungskonzept.
Klasse Vereinslaeufer erbt von Laeufer. Ich muss dazu sagen, dass das mein
erstes mal wo ich in c++ mit Vererbung zu tun hab.
Ich kopiere mal die header dateien von Vereinslaeufer und Laeufer rein:Laeufer.h:
#ifndef Laeufer_H #define Laeufer_H #include<string> class Laeufer{ //Deklarieren der Attribute protected: int startnr; std::string nachname; std::string vorname; int alter; double startgebuehr; char geschlecht; double zeit; // deklarieren der Methoden public: Laeufer(); ~Laeufer(); void anlegen(void); void ausgeben(void); int getstartnr(); int getAlter(); char getVereinzug(); std::string getVereinname(); double getStartgebuehr(); void gebuehrNichtVerein(void); void ergebnisse(void); double getZeit(void); char getGeschlecht(void); void anzeigenKatJug(void); void anzeigenKatFrau(void); void anzeigenKatMann(void); }; #endifLaeufer.h:
#ifndef Vereinslaeufer_H #define Vereinslaeufer_H #include "Laeufer.h" #include<string> class Vereinslaeufer : public Laeufer { private: char vereinzug; std::string vereinname; public: Vereinslaeufer(); ~Vereinslaeufer(); void anlegen(void); }; #endifIch weiß nicht, ob euch die header-dateien reichen, ich könnte die cpp files
auch noch einfügen. Wär klasse, wenn jemand auf meinen Fehler kommen würde.Gruß
Martin
-
Es ist doch offensichtlich: Laeufer::anlegen gibt's doppelt, und Vereinslaeufer::anlegen fehlt. Wahrscheinlich hast du bei Vereinslaeufer::anlegen einfach den falschen Klassennamen hingeschrieben.
-
Ah super klasse *g*
Eine kleine Anfängerfrage noch, wie kann ich die methode von Laeufer aufrufen?
Ich möchte keine neue Methode "anlegen" in Vereinlaeufer erzeugen, sondern über Vereinslaeufer die geerbte Methode "anlegen"aufrufen.
Ich hoffe, ich drück mich net zu umständlich aus.
Schönen Abend noch und recht herzlichen Dank.
-
Hab vergessen noch zu sagen, da die Methode Laeufer::anlegen()
sehr viele Attribute abfrägt. Von Vornamen bishin zu Geburtsdatung.
Laut der Theorie, wird doch bei einer Vererbung auch Methoden vererbt
werden. Wenn ich jetzt die Methode Vereinslaeufer::anlegen() erzeuge,
dann ist es erforderlich, neue Variablen anzulegen.
Gibt es da eine Möglichkeit?
-
Ich habs jetzt rausbekommen, so funktioniert es:
Diese Methode steht in Vereinslaeufer.h
void Vereinslaeufer::anlegen(){
Laeufer::anlegen();
}Aber verstehen tue ichs nicht.
Warum kann ich nicht das schreiben:
void Laeufer::anlegen(){
}
-
Hat keiner eine Antwort auf meine Frage?
wäre echt schön...
-
Naja du hast die gleiche Methode 2x.
Das heisst das 2te anlegen() überschreibt das erste.
Geb beiden Methoden einen eindeutigen Namen wie LaeuferAnlegen() und VLaeuferAnlegen(), dann gibts keine Probleme.
rya.
-
Oder die vererbte Methode anlegen() benutzen (Tun ja beide eh das selbe)
Eleganter wäre aber das ganze über Konstruktorparameterlisten
Kurzes Beislpiel:#include<iostream> using namespace std; class CZimmer { private: float m_fHoehe,m_fBreite,m_fLaenge; public: CZimmer(float fH,float fB,float fL) : m_fHoehe(fH),m_fBreite(fB) { m_fLaenge=fL; //Zur Demonstration einmal anders } void Zeige(void) { cout<<"Hoehe ="<<m_fHoehe<<endl <<"Breite ="<<m_fBreite<<endl <<"Laenge ="<<m_fLaenge<<endl; } }; class CBad :public CZimmer { private: bool m_bWanne,m_bDusche; //Vorhanden? float m_fLeistungBoiler; public: CBad(float fh,float fB,float fL,bool bW,bool bD,float fLB) : CZimmer(fH,fB,fL),m_bWanne(bW) { m_bDusche=bD; //Wieder nur zur Demo m_fLeistungBoiler=fLB; //Für eine von beiden Methoden entscheiden } void Zeige(void) { CZimmer::Zeige(); cout<<"Wanne :"<<(m_bWanne ? "Ja" : "Nein" )<<endl <<"Dusche :"<<(m_bDusche ? "Ja" : "Nein" )<<endl <<"Leistung des Boilers :"<<m_fLeistungBoiler<<endl; }; int main() { CBad Bad(2.5F,5.F,4.25F,false,true,500.F); //Hier werden beide angelegt Bad.Zeige(); //Und hier neide angezeigt return(0); }
Na gut war ein langes Beispiel...
Aber wichtig ist, dass man das Printzip verstehtDein nächster Schritt sollte die Polymorphie sein
-
danke für die Antworten, freut mich
Beste Grüße