Пространства имен C ++ и определения классов в отдельных файлах - PullRequest
31 голосов
/ 04 ноября 2010

Я хочу создать пространство имен, которое будет содержать несколько классов как часть "пакета".

Нужно ли объявлять все классы в пространстве имен?

Например, если у меня есть "2dEngine.h", который определяет пространство имен 2dEngine, должен ли я объявить все отдельные классы в этом заголовочном файле? Или я все еще могу разделить их на отдельные файлы заголовков (.h) и сделать их частью пространства имен?

Псевдо пример:

TwoEngine.h

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

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

Вместо этого я хочу, чтобы Canvas и Primitive были их собственными файлами .h и просто как-то утверждали, что они являются частью этого пространства имен.

Извините, я все еще довольно новичок в этом.

Ответы [ 3 ]

37 голосов
/ 04 ноября 2010

Да, вы можете разделить пространство имен на несколько блоков (и, следовательно, файлов).Ваши классы будут принадлежать к одному пространству имен, если они объявлены в блоке namespace с тем же именем.

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

// Primitive.h
namespace TwoEngine
{
    class Primitive
    {
        // Define all of Primitive here
    };
}
6 голосов
/ 04 ноября 2010

Пространства имен могут быть непрерывными. Вы можете воспользоваться этим, сохранив соответствующие классы в вашем 2DEngine.h, который, вероятно, будет использоваться клиентским кодом и будет поставляться как часть вашей библиотеки.

Все остальное, что не должно быть открыто внешнему миру, все еще может быть помещено в то же пространство имен, но в отдельный заголовочный файл (который не поставляется).

Заголовок H1.h (часть интерфейса библиотеки с внешним миром)

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

Заголовок H2.h (не является частью интерфейса библиотеки с внешним миром)

#include "H1.h"
namespace TwoEngine      // reopen the namespace and extend it
{
    class Primitive 
    { 
        // Define all of Primitive here 
    }; 
}
1 голос
/ 04 ноября 2010

Да, просто используйте директиву пространства имен внутри файлов реализации.

...