Пространства имен С++ и определение классов в отдельных файлах
Я хочу создать пространство имен, которое будет содержать несколько классов как часть пакета.
Должен ли я объявлять все классы в пространстве имен?
Например, если у меня есть "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 файлами и просто каким-то образом заявили, что они являются частью этого пространства имен.
Извините, я до сих пор довольно новичок в этом.
Ответы
Ответ 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
Да просто используйте директиву пространства имен внутри файлов реализации.