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.
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
Vous devez vous connecter pour publier un commentaire.
Oui. Tout d'abord, Ne pas définir
num
dans le fichier d'en-tête. Déclarer commeextern
dans l'en-tête puis de créer un fichierGlobal.cpp
pour stocker le mondial, ou le mettre dansmain.cpp
comme Thomas Jones-Bas, en réponse suggérée.Deuxième, ne pas utiliser de variables globales.
Troisième,
typedef
est pas nécessaire pour cet objet en C++. Vous pouvez déclarer votre structure comme ceci:OriginalL'auteur Fred Larson
Mondiale.h
puis, au sommet de main.cpp
OriginalL'auteur Thomas Jones-Low
Puisque vous avez écrit en C++, utilisez ce formulaire de déclaration pour une structure (struct):
Le typedef est inutile.
OriginalL'auteur quamrana