2010-04-11 17 views
6

¿Tengo que poner el código de .cpp en un espacio de nombres de la .h correspondiente o basta con escribir usando la declaración?¿Debería estar en un espacio de nombres?

//file .h 
namespace a 
{ 
/*interface*/ 
class my 
{ 
}; 
} 

//file .cpp 

using a::my; // Can I just write in this file this declaration and 
      // after that start to write implementation, or 
      // should I write: 

namespace a //everything in a namespace now 
{ 
//Implementation goes here 
} 

Thanks.

Respuesta

4

Considero más apropiado rodear todo el código que debe estar en el espacio de nombres dentro de un bloque namespace a { ... }, ya que eso es semánticamente lo que estás haciendo: estás definiendo elementos dentro del espacio de nombres a. Pero si solo está definiendo miembros, entonces ambas cosas funcionarán.

Cuando el compilador encuentra void my::foo(), se tratará de determinar lo que es my, y que se encuentra el using a::my, resolver my de eso y entender que va a definir el método a::my::foo.

Por otra parte este enfoque fallará si está utilizando funciones gratuitas:

// header 
namespace a { 
    class my { // ... 
    }; 
    std::ostream & operator<<(std::ostream& o, my const & m); 
} 
// cpp 
using a::my; 
using std; 
ostream & operator<<(ostream & o, my const & m) { 
    //.... 
} 

El compilador estará feliz de traducir el código anterior en un programa, pero lo que está haciendo en realidad se declara std::ostream& a::operator<<(std::ostream&, a::my const &) en la cabecera file --without implementation-- y definiendo std::ostream& ::operator<<(std::ostream &, a::my const &) en el archivo cpp, que es una función diferente. Uso de la búsqueda Koening, siempre que el compilador ve cout << obj con obj de tipo a::my, el compilador buscará en los espacios de nombres de cerramiento de cout y my (std y a) y encontrará que hay una a::operator<< declarados pero nunca definido en namespace a. Recopilará pero no vinculará su código.

+0

+1. Lo que está en el espacio de nombres está en 'namespace {}'. Cosas como esta no requieren indentación así que realmente no hay problemas. – Potatoswatter

1

Si he entendido bien la pregunta, que puede tener apenas usando un :: mi y luego simplemente poner en práctica los métodos, como

using a::my; 

void my::doSomething() {} 
0

Usted puede hacerlo. Pero, debe usted?

Es una práctica poco común, y probablemente conduzca a una proliferación de using a::Type; para cada tipo del espacio de nombres 'a' utilizado en el archivo .cc. Si eso es algo bueno es para que usted decida, pero yo votaría en contra de él :)

+0

También puede usar 'using namespace a;' e implementar el código sin la necesidad de tener un gran espacio de nombres a {} en el código. Las declaraciones del espacio de nombres son para encabezados. – luiscubal

Cuestiones relacionadas