nicht aufgelöstes externes Symbol
-
Hallo!
Ich bekomme beim Kompilieren folgende Fehler:
1>------ Erstellen gestartet: Projekt: GSE1, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>cl : Befehlszeile warning D9035 : Die Option "Wp64" ist veraltet und wird in einer der nächsten Versionen entfernt.
1>test.cpp
1>Verknüpfen...
1>test.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual bool __thiscall CGiro::copy(class CGiro)" (?copy@CGiro@@UAE_NV1@@Z)".
1>test.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual bool __thiscall CGiro::equalValue(class CGiro)" (?equalValue@CGiro@@UAE_NV1@@Z)".
> ... noch 9 davon...
1>C:\Dokumente und Einstellungen\root\workspace\GSE1\Debug\GSE1.exe : fatal error LNK1120: 10 nicht aufgelöste externe Verweise.
1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\root\workspace\GSE1\Debug\BuildLog.htm" gespeichert.
1>GSE1 - 11 Fehler, 1 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Das ist meine main-Funktion in meiner test.cpp:
#include <string> #include <iostream> #include "CDate.h" #include "CGiro.h" using namespace std; int main() { CDate date(10,02,3005); CGiro *g = new CGiro(1, date, "Kira", 0.01, date, 1000.00); g->show(); system("pause"); return 0; }Die Klassen sind etwas umfangreicher.
CDate ist einfach eine Klasse, die 3 Zahlen hält.
CGiro ist von der abstrakten Klasse CAccount abgeleitet.In CGiro.h habe ich include "CAccount.h" drin.
Nun bin ich recht neu in C++ und habe nicht so viel Ahnung - trotzt Hilfe - was mir dieser Fehler sagen soll und was ich ändern muss, damit er weg geht.
Hilfe! *liebguck*
Grüße, pktm
-
pktm schrieb:
Mit dem Code alleine kann ich nur raten[
1>test.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual bool __thiscall CGiro::copy(class CGiro)" (?copy@CGiro@@UAE_NV1@@Z)".
1>test.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual bool __thiscall CGiro::equalValue(class CGiro)"Der Compiler findet nicht die entsprechende Implementierung der Methode...
Ein paar Möglichkeiten:
a) Du hast in den Cpp-Dateien statt ...bool CGiro::copy(... ein ...bool copy(... stehen (Bei Membervariablen ist die Klasse mit anzugeben).
b) Du hast die virtuellen Methoden nicht implementiert
c) Die Cpp-Dateien wurden nicht deinem Projekt hinzugefügt
...Zudem noch 2 weitere Anmerkungen:
pktm schrieb:
int main() { CDate date(10,02,3005); CGiro *g = new CGiro(1, date, "Kira", 0.01, date, 1000.00); g->show(); system("pause"); // <-- Unschön und Plattformabhängig [1] return 0; // <-- Hiervor fehlt noch ein delete g; [2] }1. Siehe Konsolen-FAQ (Automatisches Schließen verhindern oder so ähnlich)
2. Was du mit new anlegst hast du auch mit delete aufzuräumen, an dieser Stelle verstehe ich eh nicht, warum du mit new Arbeitest...In aller Kürze:
int main() { CDate date(10,02,3005); CGiro g(1, date, "Kira", 0.01, date, 1000.00); g.show(); wait(); // Siehe Konsolen-FAQ }cu André
-
Hallo!
Also, mit new() arbeite ich mehr so aus gewohnheit, ich habe keine Ahnung, wann man new() nehmen sollte oder wann man statisch initialisieren sollte.
Es trifft den 3. Punkt, ich habe die cpp-Dateien nicht zum Projekt hinzugefügt.
Brauche ich die? Ich habe bislang einfach eine .h-Datei geschrieben wo meine Funktionen drin waren und die mit #include "datei.h" verwendet.
Allerdings hatte ich da auch noch keine IDE, und daher habe ich gar nicht verstanden, warum da auf einmal cpp-Dateien für meine .h-Dateien angelegt wurden.
Was kommt denn in die .h und was kommt in die .cpp?Danke & Grüße, Alex
-
Grundsätzlich gehört in den Header die Deklaration und in die .cpp die Definition.
Sprich:
xxx.hclass foo { public: void bar (); };xxx.cpp
void foo::bar () {...}Die Deklarationen sind wichtig für die anderen Einheiten, damit die wissen, was das für ne Klasse ist und was die für Funktionen hat. Darum musst du das per #include inkludieren und die Source wird normalerweise von der IDE mitgelinkt.