Y a-t-il une différence entre l'encapsulation à la fois du contenu de l'en-tête et du fichier cpp dans un espace de noms ou l'encapsulation uniquement du contenu de l'en-tête et l' utilisation de l'espace de noms dans le fichier cpp?
Par différence, j'entends toute sorte de pénalité de performance ou une sémantique légèrement différente qui peut causer des problèmes ou tout ce dont je dois être conscient.
Exemple:
// header
namespace X
{
class Foo
{
public:
void TheFunc();
};
}
// cpp
namespace X
{
void Foo::TheFunc()
{
return;
}
}
CONTRE
// header
namespace X
{
class Foo
{
public:
void TheFunc();
};
}
// cpp
using namespace X;
{
void Foo::TheFunc()
{
return;
}
}
S'il n'y a pas de différence, quelle est la forme préférée et pourquoi?
la source
Il n'y a pas de pénalités de performance, car le résultat pourrait être le même, mais placer votre
Foo
dans un espace de noms introduit implicitement une ambiguïté au cas où vous auriez desFoo
s dans différents espaces de noms. Vous pouvez en effet obtenir votre code fubar. Je recommanderais d'éviter d'utiliserusing
à cette fin.Et vous avez un égaré
{
aprèsusing namespace
;-)la source
}
à la toute fin. Cependant, j'appellerais cette paire d'accolades redondante;)Si le second compile également, il ne devrait y avoir aucune différence. Les espaces de noms sont traités au moment de la compilation et ne doivent pas affecter les actions d'exécution.
Mais pour les problèmes de conception, la seconde est horrible. Même s'il compile (pas sûr), cela n'a aucun sens.
la source
{
;-)Le Foo :: TheFunc () n'est pas dans l'espace de noms correct dans le VS-case. Utilisez 'void X :: Foo :: TheFunc () {}' pour implémenter la fonction dans l'espace de noms correct (X).
la source
Dans le cas où vous n'emballez que le contenu .h, vous devez écrire en utilisant l'espace de noms ... dans le fichier cpp sinon vous travaillez à chaque fois sur l'espace de noms valide. Normalement, vous encapsulez les fichiers .cpp et .h, sinon vous risquez d'utiliser des objets d'un autre espace de noms, ce qui peut générer beaucoup de problèmes.
la source
Je pense que la bonne chose à faire ici est d'utiliser un espace de noms pour la portée.
namespace catagory { enum status { none, active, paused } }; void func() { catagory::status status; status = category::active; }
la source
Si vous essayez d'utiliser des variables de l'une à l'autre, je vous recommande de les externaliser, puis de les initialiser dans le fichier source comme suit:
// [.hh] namespace example { extern int a, b, c; } // [.cc] // Include your header, then init the vars: namespace example { int a, b, c; } // Then in the function below, you can init them as what you want: void reference { example::a = 0; }
la source