Linker meldet doppelt definierte Symbole
-
Hallo,
ich bin gerade dabei ein kleines c++ projekt zu schreiben. Unter anderem habe ich mir eine Traceklasse erstellt. Diese ist ein Singleton. Ich kann die Klasse vollständig übersetzen und linken. Binde ich aber das Headerfile in eine andere als die Implementierungsklasse ein, meldet der Compiler doppelt vorhandene Sysmbole. Ich dachte genau dies soll
#pragma onceverhindern. Ich habe dann noch zusätzlich
#ifndef ... usw.eingebaut. Hilft aber nix. Habe ich einen Fehler bei meiner Klassendeklaration?? Die Klasse sieht so aus:
[/cpp]
#pragma once#ifndef __TRACER_H__
#define __TRACER_H__class CTracer
{
public:
/* Returns the unique instance of the tracer object /
/* If no one exist a new instance will be created /
static CTracer getTracer() {
if (!m_pT) {
m_pT = new CTracer();
m_pTF = new CFile();
CFileException e;
TCHAR pszFileName = _T("C:\\temp\\\trace.log");
if(!m_pTF->Open(pszFileName, CFile::modeCreate | CFile::modeWrite, &e))
{
TRACE(_T("File could not be opened %d\n"), e.m_cause);
} else {
m_pT->writeTrace("Tracer instance created ...\n");
}
}
return m_pT;
}void writeTrace(const char* data);
private:
static CTracer* m_pT;
CTracer () { }; /* avoid object creation of the CTracer class /
CTracer ( const CTracer& ); / avoid class instantiation via copy constructor */
~CTracer () { };
// Points to the trace file handle
static CFile *m_pTF;
};CTracer* CTracer::m_pT = NULL;
CFile* CTracer::m_pTF = NULL;#endif
[cpp]Nach dem einbinden des Headerfiles meldet der COmpiler:
1>Tracer.obj : error LNK2005: "private: static class CTracer * CTracer::m_pT" (?m_pT@CTracer@@0PAV1@A) ist bereits in MFC_DB_Test.obj definiert. 1>Tracer.obj : error LNK2005: "private: static class CFile * CTracer::m_pTF" (?m_pTF@CTracer@@0PAVCFile@@A) ist bereits in MFC_DB_Test.obj definiert. 1>D:\MFC_DB_Test\Debug\MFC_DB_Test.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.Was mache ich hier falsch? Und wer kann mir sagen wie ich es richtig machen kann?
Danke im Voraus!!
FrankyBoy
-
Das:
CTracer* CTracer::m_pT = NULL; CFile* CTracer::m_pTF = NULL;muss in die Source-Datei. Wenn die Header-Datei mit diesen Zeilen mehrfach eingebunden wird, ist doch logisch, dass sie mehrfach definiert werden.
-
Danke. Ja du hast Recht - ist eigentlich logisch - wenn man drüber nachdenkt

Danke, das Problem ist gelöst.