[C++] ofstream mehrfach definiert

Hi,

ich habe ein kleines (Verständnis-?)Problem mit dem ofstream in C++.
Ich habe ein Programm geschrieben, welches aus mehreren Einzeldateien besteht. In jeder dieser Datei will ich den ofstream verwenden (es soll immer in die gleiche datei geschrieben werden). Beim Erstellen bekomme ich dann die Fehlermeldung:
Code:
test.obj : error LNK2005: "class std::basic_ofstream<char,struct std::char_traits<char> > fileout" (?fileout@@3V?$basic_ofstream@DU?$char_traits@D@std@@@std@@A) ist bereits in main.obj definiert
fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
Anscheinend mache ich da irgendeinen Fehler, auf den ich nicht von selbst kommen will. Der ofstream "fileout" ist eigentlich nur in "main.h" definiert (welches über #ifndef durch mehrfaches Einbinden abgesichert ist), in test.cpp soll er dann in einer show-Funktion verwendet werden, ebenso in der main.cpp. (In welcher Datei muss denn dann der ofstream stehen? das passt bei mir anscheinend nicht).

Über Hilfe wäre ich sehr dankbar :confused:

Hier das Programm:

main.cpp
Code:
#include "Ctest.h"

void main(void)
{
	cout << "Test" << endl;
	fileout << "Test" << endl;
}

main.h
Code:
#ifndef main_h
#define main_h

#include <iostream>
#include <fstream>

using namespace std;

	ofstream fileout("output.txt");

#endif

test.cpp
Code:
#include "Ctest.h"

ctest::ctest() {
out = 3;
}

ctest::~ctest() {}

void ctest::show() {
fileout << out << endl;
}

und test.h
Code:
#ifndef test_h
#define test_h

#include "main.h"

class ctest {
private:
	int out;
public:
	ctest();
	~ctest();
	void show();
};


#endif

Vielen Dank!
Grüße mymic
 
Du musst in test.cpp die Ctest.h nicht nochmal inkludieren, wenn die eh direkt mit der main.cpp, wo diese Datei bereits inkludiert ist, kompiliert wird. Inkludierst du nämlich 2 Mal, hast du auch 2 Mal die Definition der darin enthaltenen Klasse.

Um's anders zu sagen:

main.cpp inkludiert Ctest.h mit der Klassen-Definition + main.cpp ist gelinkt zu test.cpp, die wiederum Ctest.h mit der Klassen-Definition inkludiert = Fazit: Klassen-Definition ist 2 Mal vorhanden und da identisch und nicht in den Parametern verschieden (Overloading) hast du ein mehrfach definiertes Symbol.
 
Include-Guards verhindern nur, dass die Symbole während dem kompilieren nicht mehrfach auftauchen. Die Zeile
Code:
ofstream fileout("output.txt");
erzeugt allerdings zusätzlich zur Deklaration eine Definition, oder anders ausgedrückt, ein Symbol in der Objekt-Datei. Und zwar in jeder Übersetzungseinheit. Wenn du das dann versuchst zu linken sieht der Linker dieses Symbol nun zweimal und beschwert sich natürlich darüber.

Eine Lösung wäre die Variable in main.h als extern zu deklarieren:
Code:
#ifndef main_h
#define main_h

#include <iostream>
#include <fstream>

using namespace std;

extern ofstream fileout;

#endif

Und dann in der main.cpp zu definieren:
Code:
#include "test.h"

ofstream fileout("output.txt");

int main(int argc, char **argv)
{
	cout << "Test" << endl;
	fileout << "Test" << endl;
	
	return 0;
}

Oder noch besser, man hält sich an die Grundregel Nummer 1: Verwende keine globalen Variablen. :wink:

mfg benediktibk
 
Zurück
Oben