Making Global Struct en C++ Programme

Je suis en train de faire mondiale de la structure, ce qui va être vu de n'importe quelle partie du code source. J'en ai besoin pour mon grand projet Qt, où certaines variables globales nécessaires. Ici, il est: 3 fichiers (à l'échelle mondiale.h, boîte de dialogue.h & main.cpp). Pour la compilation j'utilise Visual Studio (Visual C++).

mondiale.h

#ifndef GLOBAL_H_
#define GLOBAL_H_

typedef struct  TNumber {
    int g_nNumber;
} TNum;

TNum Num;

#endif

boîte de dialogue.h

#ifndef DIALOG_H_
#define DIALOG_H_

#include <iostream>
#include "global.h"

using namespace std;

class   ClassB {
public:
    ClassB() {};

    void    showNumber() {
        Num.g_nNumber = 82;
        cout << "[ClassB][Change Number]: " << Num.g_nNumber << endl;
    }
};

#endif

et main.cpp

#include <iostream>

#include "global.h"
#include "dialog.h"

using namespace std;

class   ClassA {
public:
    ClassA() {
        cout << "Hello from class A!\n";
    };
    void    showNumber() {
        cout << "[ClassA]: " << Num.g_nNumber << endl;
    }
};

int main(int argc, char **argv) {
    ClassA  ca;
    ClassB  cb;
    ca.showNumber();
    cb.showNumber();
    ca.showNumber();
    cout << "Exit.\n";
    return 0;
}

Quand je suis en train de construire cette petite application, la compilation fonctionne très bien, mais l'éditeur de liens me donne de nouveau une erreur:

1>dialog.obj : error LNK2005: "struct TNumber Num" (?Num@@3UTNumber@@A) already defined in main.obj

Est il existe une solution?

Grâce.

Et ne pas utiliser avant ou après les caractères de soulignement dans votre en-tête des gardes, et de ne jamais utiliser using namspace std; dans les en-têtes.
mais si j'ai besoin de cout ou d'impression du texte de l'en-tête, le son comme dans l'exemple (boîte de dialogue.h)? J'ai utiliser using namespace std; de commande.
il n'y a rien de mal avec des traits de soulignement (en dehors de la recherche, hein.). @mosg: vous devez déplacer le code d'un fichier source, ou de qualifier les symboles std::cout et std::endl. Mettre un using la déclaration dans un fichier d'en-tête peut causer de petites erreurs dans le code qui inclut l'en-tête.
Je pense que vous pouvez avoir des ennuis avec le nom affrontements lors de la liaison à d'autres langues si vous utilisez de fuite souligne - mieux éviter.
Vous ne devriez pas utiliser 'typedef struct Foo { } Foo;" en C++. 'struct Foo { };' fonctionne très bien. Fuite des traits de soulignement sont beaux, trop, et sont utilisés par de nombreux. /En-tête/ de souligne peut conduire à la liaison entre les conflits avec d'autres langues, et en utilisant des caractères de soulignement avec des lettres majuscules contreviendrait à la norme.

OriginalL'auteur mosg | 2010-03-23