如何在C++中隐藏一些类的字段

kri*_*ina 4 c++

我想开源项目,但我有一个头文件,如下所示:

class Foo {
 public:
  int bar;
  int super_secret_field;
};
Run Code Online (Sandbox Code Playgroud)

我希望开源标头有bar字段,但不是super_secret_field.我仍然想要一个封闭源版本super_secret_field.

我不能使用两个单独的头文件,因为那么使用的类Foo将具有奇怪的包含.我可以用#includes做一些hacky然后在发布的版本中删除它们,但我宁愿不这样做.

有没有更好的办法?

Bor*_*der 6

我相信你的问题的解决方案是PIMPL习语.

在你的情况下,它看起来像:

// .h
class SecretType; // forward decl

class Foo {
 public:
  int bar;
  SecretType* secret_field;
};
Run Code Online (Sandbox Code Playgroud)

在.cpp中你将包含包含SecretType声明的标题.这实际上隐藏了SecretType库的用户的详细信息.

PS:我将类型从int更改为类,使解释更加完整.