考虑以下代码:

/*
 * myclass.h
 */

class myclass_impl
{
    // ...
}

boost::shared_ptr<myclass_impl> myclass;

我可以以某种方式使myclass_impl(或者至少直接使用它)对于定义它的翻译单元是私有(private)的,从而允许客户端仅使用myclass typedef吗?我试图实现的是让编译器在有人直接使用实现类的情况下提醒我。

最佳答案

在源文件(而不是头文件)中声明您的类(class),其他翻译单位将无法访问该类(class)。然后,使用前向声明在头文件中声明一个指针/引用。

或定义一个impl头文件并注释它不应包含在其他源文件中。

/*
 * myclass.h
 */

class myclass_impl;

class myclass
{
  boost::shared_ptr<myclass_impl> myclass_i;
public:
  myclass() : myclass_i(new myclass_impl) { }
  int getI() const;
};


/*
 * myclass.cpp
 */

class myclass_impl
{
  int i;
public:
  myclass_impl() : i(4) { }
  int getI() const { return i; }
};

int myclass::getI() const
{
  return myclass_i->getI();
}

10-04 12:45