2010-11-04 19 views
19

Voglio creare uno spazio dei nomi che conterrà diverse classi come parte di un "pacchetto".Spazi dei nomi C++ e classi di definizione in file separati

Devo dichiarare tutte le classi all'interno dello spazio dei nomi?

Ad esempio, se si dispone di un "2dEngine.h" che definisce lo spazio dei nomi 2dEngine, è necessario dichiarare tutte le singole classi all'interno di tale file di intestazione? O posso ancora separarli in file header separati (.h) e farli essere parte dello spazio dei nomi?

Pseudo esempio:

TwoEngine.h

namespace TwoEngine 
{ 
    class Canvas 
    { 
     // Define all of Canvas here 
    }; 

    class Primitive 
    { 
     // Define all of Primitive here 
    }; 
} 

Invece di fare questo, voglio avere Canvas e Primitivo essere i propri file .h e solo in qualche modo affermare che essi sono parte di quel namespace.

Scusa, sono ancora piuttosto nuovo in questo.

risposta

25

Sì, è possibile suddividere lo spazio dei nomi in più blocchi (e quindi file). Le tue classi apparterranno allo stesso spazio dei nomi purché siano dichiarate nel blocco namespace con lo stesso nome.

// Canvas.h 
namespace TwoEngine 
{ 
    class Canvas 
    { 
     // Define all of Canvas here 
    }; 
} 

// Primitive.h 
namespace TwoEngine 
{ 
    class Primitive 
    { 
     // Define all of Primitive here 
    }; 
} 
3

Gli spazi dei nomi possono essere discontinui. Puoi trarre vantaggio da ciò mantenendo le classi rilevanti nel tuo 2DEngine.h che probabilmente verrà utilizzato dal codice cliente e verrà spedito come parte della tua libreria.

Qualsiasi altra cosa, che non deve essere rivelata al mondo esterno, può ancora essere inserita nello stesso spazio dei nomi ma in un file di intestazione separato (che non è stato spedito).

Header H1.h (parte dell'interfaccia biblioteca per il mondo esterno)

namespace TwoEngine 
{ 
    class Canvas 
    { 
     // Define all of Canvas here 
    }; 
} 

Header H2.h (non parte dell'interfaccia biblioteca per il mondo esterno)

#include "H1.h" 
namespace TwoEngine  // reopen the namespace and extend it 
{ 
    class Primitive 
    { 
     // Define all of Primitive here 
    }; 
} 
0

Sì basta usare anche la direttiva space space all'interno dei file di implementazione.

Problemi correlati