2017-07-18 1 views
2

J'ai un global.h qui ressemble à:Comment initialiser les variables externat dans un espace de noms

#pragma once 

#include <memory> 

namespace qe 
{ 

    class SubSystemA; 
    class SubSystemB; 
    class SubSystemC; 

    namespace Systems 
    { 

     extern std::unique_ptr<SubSystemA> gSubSystemA; 
     extern std::unique_ptr<SubSystemB> gSubSystemB; 
     extern std::unique_ptr<SubSystemC> gSubSystemC; 

    } 

} 

Maintenant, je ne sais pas si je peux l'initialiser dans mon main.cpp mais w/e Je Je fais, ça ne marche pas ... s'il vous plait, conseillez. Voici ce que principale ressemble à:

#include "SubSystemA.h" 
#include "SubSystemB.h" 
#include "SubSystemC.h" 
#include "global.h" 

int main() 
{ 

    extern std::unique_ptr<qe::SubSystemA> qe::Systems::gSubSystemA; 
    extern std::unique_ptr<qe::SubSystemB> qe::Systems::gSubSystemB; 
    extern std::unique_ptr<qe::SubSystemC> qe::Systems::gSubSystemC; 

    qe::Systems::gSubSystemA = std::make_unique<qe::SubSystemA>(); 
    qe::Systems::gSubSystemB = std::make_unique<qe::SubSystemB>(); 
    qe::Systems::gSubSystemC = std::make_unique<qe::SubSystemC>(); 

    return 0; 
} 

Fondamentalement, j'obtiens l'erreur « symbole externe non résolu » et je ne sais pas comment je peux le réparer. Toute aide est la bienvenue, merci! Edit: tout en résolvant cela est bon à savoir, des suggestions alternatives à cet égard sont les bienvenues. Je veux juste avoir un accès facile (ne veut pas dire global mais cela ne me dérange pas) au sous-système comme des objets.

+0

Dans le fichier cpp retirer les déclarations 'extern'; vous avez déjà fait # #include "global.h" '. Ajoutez des définitions pour ces éléments à l'un de vos fichiers .cpp. Vous pouvez avoir des initialiseurs sur les définitions ou utiliser des instructions d'assignation comme vous le faites actuellement. –

+0

Suppression fait une erreur de compilation en disant re-définition. Retrait de la ligne entière (les 3 uniques_ptr <>) me donne toujours l'erreur de l'éditeur de liens tout en compilant bien. – ChaoSXDemon

Répondre

3

Vous devez les définir (initialiser) sur main() (c'est-à-dire dans la portée de l'espace de noms) et ne pas utiliser le spécificateur extern, qui indique une déclaration. par exemple.

std::unique_ptr<qe::SubSystemA> qe::Systems::gSubSystemA = std::make_unique<qe::SubSystemA>(); 
std::unique_ptr<qe::SubSystemB> qe::Systems::gSubSystemB = std::make_unique<qe::SubSystemB>(); 
std::unique_ptr<qe::SubSystemC> qe::Systems::gSubSystemC = std::make_unique<qe::SubSystemC>(); 

int main() 
{ 
    ... 
} 
+0

Et si elles dépendent de la commande? Dire que je veux B, A, puis C dans cet ordre. Je pense que C++ 11 et les versions suivantes devraient les initialiser dans l'ordre où vous les tapez ... mais je veux confirmer cela. – ChaoSXDemon

+0

@ChaoSXDemon Au sein d'une même unité de traduction, l'initialisation de ces variables est toujours séquencée dans l'ordre exact où leurs définitions apparaissent dans le code source. L'ordre d'initialisation des variables entre différentes unités de traduction est indéterminé. – songyuanyao

3

Les lignes

qe::Systems::gSubSystemA = std::make_unique<qe::SubSystemA>(); 
qe::Systems::gSubSystemB = std::make_unique<qe::SubSystemB>(); 
qe::Systems::gSubSystemC = std::make_unique<qe::SubSystemC>(); 

en main ne définissent pas les variables. Ils assignent des valeurs aux variables. Ils doivent être définis en dehors de toutes les fonctions. Il est préférable de les définir dans le fichier .cpp correspondant au fichier .h dans lequel ils sont déclarés. Dans votre cas, ce fichier doit être global.cpp. Ajoutez les lignes suivantes en dehors de tous les espaces de noms.

qe::Systems::gSubSystemA = std::make_unique<qe::SubSystemA>(); 
qe::Systems::gSubSystemB = std::make_unique<qe::SubSystemB>(); 
qe::Systems::gSubSystemC = std::make_unique<qe::SubSystemC>(); 

Vous pouvez également utiliser:

namespace qe 
{ 
    namespace Systems 
    { 
     gSubSystemA = std::make_unique<SubSystemA>(); 
     gSubSystemB = std::make_unique<SubSystemB>(); 
     gSubSystemC = std::make_unique<SubSystemC>(); 
    } 
} 
+0

Si je les initialise dans le fichier global.h, j'aurais besoin d'inclure tous ces en-têtes, je voulais éviter cela mais merci pour cette suggestion. – ChaoSXDemon

+0

@ChaoSXDemon, peut-être que vous avez mal compris. Vous définissez et initialisez les variables dans un fichier .cpp, pas dans un fichier .h. Vous devez '# inclure 'un seul fichier .h où vous voulez utiliser les variables. –