[Erledigt] Linker Fehler: Multiple Definitions
-
Hallo allerseits,
Ich versuch mich gerade an einer kleinen Consolenanwendung und hab ein kleines Problem:
(Vorsicht, ich bin Anfänger :D)File 1:
#include <iostream> using namespace std; #include "Application.cpp" int main(int argc, char* argv[]) { Application *app = new Application(argc, argv); delete app; system("pause"); return 0; }File 2:
#pragma once #include <string> #include <vector> using namespace std; class Application { public: Application(int argc, char* args[]); private: bool isArgumentPresent(string arg); vector<string> cmdArgs; }; Application::Application(int argc, char* args[]) { for (int i = 0; i < argc; i++) { string a(args[i]); cmdArgs.push_back(a); } } bool Application::isArgumentPresent(string arg) { for (int i = 0; i < cmdArgs.capacity(); i++) { if (arg == cmdArgs[i]) { return true; } } return false; }Nachdem ich die Klassendeklaration von einer Headerdatei in die Codedatei verschoben
habe (sonst blick ich nicht mehr durch) beschwert sich auf einmal der Linker (MSVC
über "multiple definitions":Error 1 error LNK2005: "public: __thiscall Application::Application(int,char * * const)"
already defined in OOBC.obj Application.obj
Error 2 error LNK2005: "private: bool __thiscall Application::isArgumentPresent
already defined in OOBC.obj Application.obj
Error 3 fatal error LNK1169: one or more multiply defined symbols foundWeiß irgendjemand Rat?
Danke...
-
1. *.cpp Dateien werden nicht inkludiert. Nur *.h Dateien.
2. Trenne die Deklaration (-> *.h Files) von der Definition (-> *.cpp Files).
-
simon.gysi schrieb:
1. *.cpp Dateien werden nicht inkludiert. Nur *.h Dateien.
2. Trenne die Deklaration (-> *.h Files) von der Definition (-> *.cpp Files).Ist das generell nicht möglich oder bloß guter Stil?
Denn eigentlich finde ich das persönlich übersichtlicher...EDIT: Wenn ich die Application.cpp in Application.h umbenenne funktionierts *weird*
Trotzdem danke...
-
Man *kann* CPP-Dateien inkludieren. Gibt aber nur einen Fall in dem das Sinn macht (Templates) und selbst da ist es nicht schön.
Warum es mit der Umbenennung funktioniert liegt daran das dein Compiler beide CPP-Dateien übersetzt und da die erste ja die zweite inkludiert diese dann doppelt hat.
-
milan1612 schrieb:
simon.gysi schrieb:
1. *.cpp Dateien werden nicht inkludiert. Nur *.h Dateien.
2. Trenne die Deklaration (-> *.h Files) von der Definition (-> *.cpp Files).Ist das generell nicht möglich oder bloß guter Stil?
In der Regel wegen Seiteneffekten nicht möglich, eine Ausnahme hierzu sind u.a. Templates. Ganz davon abgesehen ist es zudem guter Stil, da eine saubere Trennung von Schnittstelle (Deklaration) und Implementierung (Definition) die Gefahr reduziert das man "gegen die Implementierung" programmiert, statt wie empfehlenswert "gegen die Schnittstelle". Bei Bibliotheken arbeitet man auch teilweise mit den Headern ohne die Implemenitierung zu haben.
cu André
-
Danke an alle, nachdem ich die CPP Datei in .h umbenannt habe funktioniert jetzt
alles.
Grüße, Milan
-
milan1612 schrieb:
Danke an alle, nachdem ich die CPP Datei in .h umbenannt habe funktioniert jetzt
alles.Ja, jetzt... Aber mach dir mal die Mühe diese Datei von zwei verschiedenen Stellen im Projekt zu inkludieren. Der Weg des (scheinbar) geringsten Widerstandes ist in C++ selten gut.
cu André