在标题中隐藏C ++类,而无需使用未命名的名称空间

|| 我正在编写一个C ++标头,其中定义了一个
class A {
   // ...
};
我想对外界隐藏(因为它可能会更改,甚至在此标头的未来版本中也会被删除)。 在同一标头中还存在一个类B,该类具有作为对象的类A的对象:
class B {
public:
   // ...

private:
   A a_;
};
隐藏A类与外界隔离的正确方法是什么? 如果将A的定义放在未命名的命名空间中,则编译器会发出警告,因此我认为由于内部链接的问题,我应该做其他事情。     
已邀请:
你可以做一个内部类:
class B
{
  class A { /* ... */ };
  A a_;
}
    
在C ++中解决它的正确方法是
PIMPL
惯用语。替代解决方案是将要隐藏的类放入嵌套的命名空间中,该命名空间通常称为“ 4”。但这并不能使它完全私有,因为用户仍然可以接触到它的依赖关系,并且可以直接使用它。     
代替由
class B
A
的对象,而应由hold7ѭ代替(或
shared_ptr<A>
unique_ptr<A>
等)。这样,“ 5”仅需要向前声明“ 11”,就可以在“ 5”的源文件中完全定义“ 11”。     
如果A是B的实现细节,则根本不要将其定义放在标头中。代替:
class B {

   ...
   class A * myA;
};
然后将A的定义放入B实现(即.cpp)文件中。     
证明该类不是公共API的一部分,不应使用。 在C ++中,您必须信任与您的库代码链接的程序,因为您别无选择。 C ++具有有限的“访问控制”功能,其中许多功能可以被绕开或滥用,因此您最好尊重和信任API客户端。 如果您设计的API易于正确使用,而又难以无意地不正确地使用,那么您将为您的客户提供帮助,并且如果客户滥用您的接口,这几乎不是您的错。     
无论如何,一个未命名的命名空间是无用的,因为它只能保护多次定义。您可以使用其他答案中提到的pImpl Idiom或使用use4ѭ名称空间。适用于Boost:
namespace detail{
  class A{
    // ...
  };
}

class B{
public:
  // ...
private
  A a_;
};
任何在“ 4”名称空间中弄乱东西的人都会自找麻烦。甚至可能使它更加晦涩
namespace _b_impl_detail{
  // ...
};
现在,任何接触内部任何物体的人都应该被射中脚。 :)     

要回复问题请先登录注册