在设计我的 SDK 时,我是否应该在我的 C++ header 文件中完全隐藏内部 class?
Should I totally hide the internal class in my C++ header file when designing my SDK?
我正在设计一个用 C++ 编写的 SDK。
我有一个问题:我可以或应该完全隐藏我的 public C++ header 文件中的内部 class 吗?
代码片段如下(在header文件MyPublicClass.h):
namespace PublicNamespace
{
namespace InternalNamespace
{
class MyInternalClass;
}
class MyPublicClass
{
public:
void SomeMemberFunc();
...
private:
std::shared_ptr<InternalNamespace::MyInternalClass> mImpl;
}
}
根据 the C++ PImpl design pattern(以及来自 Google 的许多其他材料),可以将 InternalNamespace::MyInternalClass 放入 public header。
我的想法是:看起来没有必要让外部用户知道内部命名空间InternalNamespace,还有class MyInternalClass。所以我想用void来代替InternalNamespace::MyInternalClass.
类型
也就是说,对于我的情况,我使用 std::shared_ptr<void> 作为数据成员的类型 mImpl,并在 .cpp 文件中,使用 std::static_pointer_cast<InternalNamespace::MyInternalClass>(mImpl) 将其转换为实际 class。
(是的,我知道这种转换会产生一些成本,但请忽略它)。
这样的设计是否正确?谢谢大家
除非别无选择,否则不要使用 void
或 void *
-- 使用 void-pointers 会阻止编译器在编译时捕获错误,并导致痛苦和痛苦。
使用明确标示的 InternalNamespace 应该就足够了(假设使用您的 API 的程序员不是故意找麻烦——如果是的话,他们还有很多其他方法可以找到无论如何),尽管如果你想从调用代码中完全隐藏 MyInternalClass
,你可以改为将它设为 MyPublicClass
的内部 class,即像这样的东西:
namespace PublicNamespace
{
class MyPublicClass
{
public:
void SomeMemberFunc();
...
private:
class MyInternalClass
{
[...]
};
std::shared_ptr<MyInternalClass> mImpl;
}
}
由于它是在 MyPublicClass
的 private
部分中声明的,因此 MyPublicClass
之外的调用代码根本无法访问它。
我正在设计一个用 C++ 编写的 SDK。 我有一个问题:我可以或应该完全隐藏我的 public C++ header 文件中的内部 class 吗?
代码片段如下(在header文件MyPublicClass.h):
namespace PublicNamespace
{
namespace InternalNamespace
{
class MyInternalClass;
}
class MyPublicClass
{
public:
void SomeMemberFunc();
...
private:
std::shared_ptr<InternalNamespace::MyInternalClass> mImpl;
}
}
根据 the C++ PImpl design pattern(以及来自 Google 的许多其他材料),可以将 InternalNamespace::MyInternalClass 放入 public header。
我的想法是:看起来没有必要让外部用户知道内部命名空间InternalNamespace,还有class MyInternalClass。所以我想用void来代替InternalNamespace::MyInternalClass.
类型也就是说,对于我的情况,我使用 std::shared_ptr<void> 作为数据成员的类型 mImpl,并在 .cpp 文件中,使用 std::static_pointer_cast<InternalNamespace::MyInternalClass>(mImpl) 将其转换为实际 class。 (是的,我知道这种转换会产生一些成本,但请忽略它)。
这样的设计是否正确?谢谢大家
除非别无选择,否则不要使用 void
或 void *
-- 使用 void-pointers 会阻止编译器在编译时捕获错误,并导致痛苦和痛苦。
使用明确标示的 InternalNamespace 应该就足够了(假设使用您的 API 的程序员不是故意找麻烦——如果是的话,他们还有很多其他方法可以找到无论如何),尽管如果你想从调用代码中完全隐藏 MyInternalClass
,你可以改为将它设为 MyPublicClass
的内部 class,即像这样的东西:
namespace PublicNamespace
{
class MyPublicClass
{
public:
void SomeMemberFunc();
...
private:
class MyInternalClass
{
[...]
};
std::shared_ptr<MyInternalClass> mImpl;
}
}
由于它是在 MyPublicClass
的 private
部分中声明的,因此 MyPublicClass
之外的调用代码根本无法访问它。