2010-09-08 6 views
2

J'ai déclaré une classe X Xh comme suit:inclusion d'espace de noms ++ C dans les fichiers .cc

namespace Foo { 
class X{ 
.... 
}; 

} 

Dans X.cc Je voudrais définir les constructeurs, les méthodes pour X.

Do I besoin d'inclure toutes mes définitions à l'intérieur namespace Foo {...} ou le préfixe X comme Foo :: X :: pour chaque méthode?

Il semble que parfois je peux dire (en utilisant l'espace de noms Foo) et ne pas le mentionner à nouveau, -à-dire définir simplement des méthodes comme X :: X() {...}

Quelle est l'approche correcte ici ?

Répondre

4

L'une des trois approches que vous suggérez fonctionnera. Étant donné:

namespace N { 
    struct S { 
     int F(); 
    }; 
} 

Vous pouvez mettre la définition dans un bloc d'espace de noms:

namespace N { 
    int S::f() { return 42; } 
} 

Vous pouvez qualifier le nom de membre avec le nom d'espace de noms:

int N::S::f() { return 42; } 

Ou vous pouvez utiliser une aide de directive (je ne recommanderais pas ceci, cependant):

using namespace N; 
int S::f() { return 42; } 

En général, je recommande de ne pas utiliser une directive using. Comme pour les deux autres (en utilisant un bloc d'espace de noms ou en qualifiant les noms), je ne pense pas que ce soit vraiment important. Je fais les deux dans mon code.

+0

'+ 1' pour recommander contre l'utilisation de directives. Ils mènent au côté obscur de la langue. – sbi

+0

@sbi: Je comprends que nous ne voulons pas utiliser 'namespace N' dans un fichier .h. Pourquoi est-il mauvais de l'avoir dans le fichier .cc? – user231536

+0

@ user231536: Il est plus difficile de comprendre le code source car vous ne savez pas d'où viennent les noms. Il introduit _all_ des noms dans l'espace de noms englobant, ce qui peut causer une grande variété de problèmes, dont l'un des plus importants est que vous pouvez involontairement prendre en compte des surcharges de fonctions supplémentaires pendant la résolution de surcharge, ce qui peut entraîner une mauvaise fonction. appelé (ou des erreurs folles à la compilation). –

0

Non, vous n'avez pas besoin d'utiliser namespace Foo {...} lors de la définition de votre classe. Toutes vos approches sont valables, mais personnellement je préfère les suivantes:

// In FOO.h 
namespace FOO 
{ 
class A 
{ 
public: 
    A(); 
}; 
} 

Et la mise en œuvre:

// In FOO.cpp 
#include "Foo.h" 
FOO::A::A() 
{ 
cout<<endl; 
} 
Questions connexes