2010-04-11 7 views
6

Muss ich den Code von .cpp in einen Namespace von der entsprechenden .h einfügen oder genügt es, mit der Deklaration zu schreiben?Sollte es in einem Namespace sein?

//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 
} 

Danke.

Antwort

4

Ich halte für besser geeignet, um den gesamten Code, der im Namespace in einem namespace a { ... }-Block sein soll, zu umgeben semantisch was Sie tun: Sie definieren Elemente innerhalb des a Namensraums. Aber wenn Sie nur Mitglieder definieren, dann werden beide Dinge funktionieren.

Wenn der Compiler void my::foo() findet, wird es versuchen zu bestimmen, was my ist, und es wird die using a::my, lösen my aus, dass und verstehen, dass Sie definieren die a::my::foo Methode zu finden.

Auf der anderen Seite dieser Ansatz wird scheitern, wenn Sie freie Funktionen verwenden:

// 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) { 
    //.... 
} 

Der Compiler wird den obigen Code in ein Programm glücklich übersetzen, aber was es wirklich tut, ist std::ostream& a::operator<<(std::ostream&, a::my const &) im Header erklärt Datei - ohne Implementierung - und definieren std::ostream& ::operator<<(std::ostream &, a::my const &) in der cpp-Datei, die eine andere Funktion ist. Mit Koening Lookup, wann immer der Compiler cout << obj mit obj vom Typ sieht a::my, wird der Compiler sucht in dem einschließenden Namespaces von cout und my (std und a) und wird feststellen, dass es eine a::operator<< deklarierte, aber nie in namespace a definiert. Es wird Ihren Code kompilieren, aber nicht verknüpfen.

+0

+1. Was sich im Namespace befindet, befindet sich im 'Namespace {}'. Dinge wie diese verlangen keine Einrückung, so dass es wirklich keinen Ärger gibt. – Potatoswatter

1

Wenn ich die Frage richtig verstanden habe, können Sie nur ein :: meine und dann implementieren nur die Methoden verwenden, wie

using a::my; 

void my::doSomething() {} 
0

Sie können es tun. Aber, sollte Sie?

Es ist eine ungewöhnliche Praxis, und es wird wahrscheinlich zu einer Proliferation von using a::Type; für jeden Typ von Namespace 'a' in der .cc-Datei verwendet führen. Ob das eine gute Sache ist, ist für Sie zu entscheiden, aber ich würde dagegen stimmen :)

+0

Sie können auch 'using namespace a;' verwenden und den Code implementieren, ohne einen großen Namensraum a {} im Code zu haben. Namespacedeklarationen gelten für Header. – luiscubal

Verwandte Themen