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

How to hide some of a class's fields in C++

本文关键字:字段 隐藏 C++      更新时间:2023-10-16

我想开源一个项目,但我有一个头文件,看起来像这样:

class Foo {
 public:
  int bar;
  int super_secret_field;
};

我希望开源标头具有bar字段,而不是super_secret_field。 我仍然想要一个带有super_secret_field的闭源版本.

我不能使用两个单独的头文件,因为这样使用 Foo 的类就会有奇怪的包含。我可以对 #includes 做一些笨拙的事情,然后在发布的版本中将它们删除,但我宁愿不这样做。

有没有更好的方法?

我相信

解决您问题的方法就是 PIMPL 习语。

在您的情况下,它看起来像这样:

// .h
class SecretType; // forward decl
class Foo {
 public:
  int bar;
  SecretType* secret_field;
};

在.cpp中,您将包含包含SecretType声明的标头。这实际上对库的用户隐藏了SecretType的详细信息。

PS:我将类型从 int 更改为类,以使解释更完整一些。

您正在寻找的是 PIMPL 习语,其中您的标头只是一个接口,可以重定向到编译单元中的私有实现。