Подтвердить что ты не робот

Пространства имен С++ и определение классов в отдельных файлах

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

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

Например, если у меня есть "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 файлами и просто каким-то образом заявили, что они являются частью этого пространства имен.

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Пространства имен могут быть некорректными. Вы можете воспользоваться этим, сохранив соответствующие классы в вашем 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 
    }; 
}

Ответ 3

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