2017-04-16 2 views
3

Tut mir leid, wenn das eine dumme Frage ist, aber ich lerne C++ (ich Code normalerweise in C) und ich verstehe nicht, wie man Namespaces und Klassen verwendet. Müssen sie in Header-Dateien deklariert werden? Wie deklariere ich Funktionen in einem Namespace? Angenommen, ich arbeite an einem großen Projekt mit verschiedenen Dateien. Und ich definiere einen Namespace in einer Datei, möchte dann aber mehr Funktionen zu demselben Namespace hinzufügen, aber diese Funktionen sind in einer anderen Datei definiert. Kann das gemacht werden? Zum Beispiel:Wie Namespaces und Klassen verwenden?

file1.cpp

namespace Example { 
    int vartest; 
    void foo(); 
} 

file2.cpp

int othervar; 
void otherfoo(); // How can I add this and othervar to the Example namespace? 

Dank!

+0

Da Sie Von C kommend, finden Sie anonyme Namensräume als nützlichen Ersatz für 'static'. 'namespace {bool Ireturntrue() {return true; }} ist jetzt schön zugemauert und wird keine Namensverschmutzung beim Linken hinzufügen. – user4581301

Antwort

4

einfach erklären es ein äquivalentes namespace des gleichen "name"!

file1.cpp

namespace Example { 
    int vartest; 
    void foo(); 
} 

file2.cpp

namespace Example { 
    int othervar; 
    void otherfoo(); 
} 

Namensräume zusammengeführt werden.

Müssen sie in Header-Dateien deklariert werden?

Nein. Sie können alle namespace in einem namespace deklarieren. (Beachten Sie, dass die „global scope“ ist auch ein namespace)

Wie erkläre ich Funktionen in einem Namespace?

Einfach innerhalb der namespace deklarieren. Wie du es getan hast.

Und sagen wir, ich arbeite an einem großen Projekt mit verschiedenen Dateien. Und ich definiere einen Namespace in einer Datei, aber dann mehr Funktionen zu demselben Namespace hinzufügen möchten, aber diese Funktionen sind in eine andere Datei definiert. Kann das gemacht werden?

Namespaces mit demselben Namen im selben Namespace werden zusammengeführt.

namespace X { void foo(){} } 
namespace X { void foo(){} } //Error, redefinition of `foo` because the namespace ::X is merged 

namespace X { void foo(){} } 
namespace Y { void foo(){} } //Ok. Different name spaces... 

namespace X { void foo(){} } // ::X 
namespace Y { void foo(){} } // ::Y 

namespace Y { 
    namespace X { // namespace ::Y::X here isn't same as ::X 
    void foo(){} //OK 
    } 
} 

erinnere sich, dass die so genannte "global scope" ist eigentlich ein Namespace als global namespace bekannt

+0

plus 1 für die letzte Notiz im globalen Namespace. – 0xDEFACED