tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
719
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    noZmo noZmo ist offline Grünschnabel
    Registriert seit
    Apr 2007
    Beiträge
    3
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    #pragma once
     
    #include "MainHandler.h"
     
    class cMainHandler;
     
    class cThreadHandler
    {
    public:
        struct strThreadData
        {
            cMainHandler * pMainHandler;
        };
    .
    .
    .

    MainHandler.h
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    #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
     

  2. #2
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.800
    Blog-Einträge
    5
    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
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  3. #3
    noZmo noZmo ist offline Grünschnabel
    Registriert seit
    Apr 2007
    Beiträge
    3
    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 :
    1
    2
    3
    
    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 :
    1
    2
    3
    
    class A;
    class B { A* a; };
    class A { B* b; };
     

  4. #4
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.800
    Blog-Einträge
    5
    Zitat Zitat von noZmo Beitrag anzeigen
    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.

    Zitat Zitat von noZmo Beitrag anzeigen
    Aber damit wird das Programm wenigstens schomma compiled, wnn ich die auskommentier kommt sowas schönes
    Code :
    1
    2
    3
    
    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.

    Zitat Zitat von noZmo Beitrag anzeigen
    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.

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

    Grüße, Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  5. #5
    noZmo noZmo ist offline Grünschnabel
    Registriert seit
    Apr 2007
    Beiträge
    3
    k, habs hinbekomm.

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

    danke dir
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Matthias Reitinger Beitrag anzeigen
    Was du machst, ist aber
    Code :
    1
    2
    3
    4
    
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. error LNK2005
    Von samkirchner im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 27.08.09, 11:10
  2. Antworten: 8
    Letzter Beitrag: 02.03.09, 11:16
  3. #pragma und #define Problem
    Von GNiewerth im Forum Borland CBuilder und VCL
    Antworten: 0
    Letzter Beitrag: 06.02.08, 16:26
  4. [C] VS05 Linker Error LNK2005
    Von Viper2009 im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 22.08.07, 14:43
  5. pragma frage
    Von netrobot im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 11.10.04, 19:16