Я разрабатываю SDK, написанный на C++. У меня есть вопрос: могу ли я полностью скрыть внутренний класс в моем общедоступном заголовочном файле C++?
Фрагменты кода выглядят следующим образом (в заголовочном файле MyPublicClass.h):
namespace PublicNamespace
{
namespace InternalNamespace
{
class MyInternalClass;
}
class MyPublicClass
{
public:
void SomeMemberFunc();
...
private:
std::shared_ptr<InternalNamespace::MyInternalClass> mImpl;
}
}
По шаблон проектирования C++ PImpl (а также многие другие материалы от Google), можно поместить InternalNamespace::MyInternalClass в общедоступный заголовок.
Моя мысль такова: кажется ненужным, чтобы внешние пользователи знали внутреннее пространство имен InternalNamespace, а также класс MyInternalClass. Поэтому я хочу использовать void для замены типа InternalNamespace::MyInternalClass.
То есть в моем случае я использую std::shared_ptr‹void› в качестве типа члена данных mImpl, а в .cpp, используйте std::static_pointer_cast‹InternalNamespace::MyInternalClass›(mImpl), чтобы преобразовать его в фактический класс. (Да, я знаю, что это преобразование стоит немного, но, пожалуйста, не обращайте на это внимания).
Является ли этот дизайн правильным или правильным? Спасибо всем.