error LNK2005 und #pragma once

noZmo

Grünschnabel
Tag,

ich kann mich irgendwie kein Stück mit Kreuz-Includes anfreunden, aber ab ner bestimmten Menge Quellcode wirds einfach irgendwann nötig.
Ich hab aber das Prob, dass der Linker mich dauernd wegen mehrfach erzeugter Symbole anmeckert, obwohl ich #pragma once benutze (was das ja meines Wissens nach eg verhindern soll, genauso wie #ifndef...#define).

Auszüg ausm Src wär sowas:

ThreadHandler.h
Code:
#pragma once

#include "MainHandler.h"

class cMainHandler;

class cThreadHandler
{
public:
	struct strThreadData
	{
		cMainHandler * pMainHandler;
	};
.
.
.

MainHandler.h
Code:
#pragma once

#include "ThreadHandler.h"

class cThreadHandler;

class cMainHandler
{
private:
	cThreadHandler * pThreadHandler;
.
.
.



Danke schomma für jeden kleinen Hinweis, weil das nervt mich schon lange und deswegen muss man immer seinen schön strukturierten Code wieder verwurschteln ^^
 
Hallo,

Include Guards (egal ob in der Form #ifndef ... #define oder mit #pragma once) verhindern nur, dass eine Datei mehrfach eingebunden wird. Was du hier machst, ist was anderes: du bindest eine Datei ein, in der eine Klasse deklariert wird und versuchst im Anschluss, die Klasse gleich nochmal zu deklarieren. Wozu brauchst du die #include hier überhaupt? Wenn du sie weglässt, sollte dein Problem gelöst sein.

Grüße, Matthias
 
Das "class cMainHandler;" und das andere sind nur Platzhalter. In denen wird die Klasse ja nicht wirklich definiert (so wie ich das mitbekommen hab).

Aber damit wird das Programm wenigstens schomma compiled, wnn ich die auskommentier kommt sowas schönes
Code:
threadhandler.h(13) : error C2143: Syntaxfehler: Es fehlt ';' vor '*'
threadhandler.h(13) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
threadhandler.h(13) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.

Und das Problem ist meiner Meinung nach doch eine Mehrfacheinbindung, weil ich den LNK2005 so oft bekomme, wie ich die jeweilige Klasse Include und nicht nur doppelt wegen "class cMainHandler;".
Das wird schon gebraucht, ist das gleiche wie bei
Code:
class A;
class B { A* a; };
class A { B* b; };
 
Das "class cMainHandler;" und das andere sind nur Platzhalter. In denen wird die Klasse ja nicht wirklich definiert (so wie ich das mitbekommen hab).
Das ist eine Vorwärts-Deklaration. Nach ihr kann die vollständige Deklaration der Klasse folgen, aber nicht andersrum.

Aber damit wird das Programm wenigstens schomma compiled, wnn ich die auskommentier kommt sowas schönes
Code:
threadhandler.h(13) : error C2143: Syntaxfehler: Es fehlt ';' vor '*'
threadhandler.h(13) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
threadhandler.h(13) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
Das ist klar, da der Typ dann nicht bekannt ist. Ich habe ja auch nur gesagt, dass du die #include weglassen sollst, nicht die Vorwärts-Deklarationen.

Und das Problem ist meiner Meinung nach doch eine Mehrfacheinbindung, weil ich den LNK2005 so oft bekomme, wie ich die jeweilige Klasse Include und nicht nur doppelt wegen "class cMainHandler;".
Dieses Verhalten ist kein Indiz für Mehrfacheinbindung.

Das wird schon gebraucht, ist das gleiche wie bei
Code:
class A;
class B { A* a; };
class A { B* b; };
Was du machst, ist aber
Code:
class A;
class B { A* a; };
class B; // Erneute Deklaration von B, unzulässig
class A { B* b; };

Grüße, Matthias
 
k, habs hinbekomm.

Hab einfach alle deklarationen inne stdafx gepackt und included wie ich lustig war...t irgendwie ^^

danke dir
 
Hi.
Was du machst, ist aber
Code:
class A;
class B { A* a; };
class B; // Erneute Deklaration von B, unzulässig
class A { B* b; };
Dieser Code ist völlig OK. Man darf (Vorwärts-) Deklarationen sooft wiederholen wie man will (selbst nach der Definition der Klasse), vorausgesetzt sie sind völlig identisch zu den vorigen Deklarationen.

Wenn dort Linkerfehler auftreten, liegt das wahrscheinlich daran, dass statische Member, Instanzvariablen oder Funktionen in der Headerdatei definiert wurden.

Gruß
 
Zurück