在设计我的 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。 (是的,我知道这种转换会产生一些成本,但请忽略它)。

这样的设计是否正确?谢谢大家

除非别无选择,否则不要使用 voidvoid * -- 使用 void-pointers 会阻止编译器在编译时捕获错误,并导致痛苦和痛苦。

使用明确标示的 InternalNamespace 应该就足够了(假设使用您的 API 的程序员不是故意找麻烦——如果是的话,他们还有很多其他方法可以找到无论如何),尽管如果你想从调用代码中完全隐藏 MyInternalClass,你可以改为将它设为 MyPublicClass 的内部 class,即像这样的东西:

namespace PublicNamespace
{
   class MyPublicClass
   {
      public:
         void SomeMemberFunc();
         ...

      private:
         class MyInternalClass 
         {
            [...]
         };

         std::shared_ptr<MyInternalClass> mImpl;
    }
}

由于它是在 MyPublicClassprivate 部分中声明的,因此 MyPublicClass 之外的调用代码根本无法访问它。