避免将私有字段声明放入 C++ header

Avoid putting private fields declaration into c++ header

当我成为 C# 爱好者时,我对 C++ 有点失望,因为我相信祖先解决了我调用 接口问题 比它的前辈更好。问题是,你无法摆脱 class 定义中的 private 字段声明,因此它的封装对我来说似乎不太诚实。例如:

// Righteous.h
#ifndef RIGHTEOUS_H
#define RIGHTEOUS_H
class Righteous
{
public:
    void Eat(Food* food);
    void Pray(Orison* orison);
    void Love(People* person); // by heart, not physically
private:
    void WatchHornyVideos(); // oops...
    void DoSomethingIllegal(); // hope people will never come here
    void DenyGodExistance(); // else I will probably see Him soon
}
#endif

甚至 C 也能更好地处理隐藏实现任务,因为您可以将它的函数和字段隐藏在 .c 文件中,将它们编译为 .lib 并部署 header 和库,而不会泄露您的脏东西秘密。

C# meta-class 信息很好,尽管现在使用记事本或 emacs 等文本编辑器提取 class 定义不方便。此外,C# 反射工具允许任何人完全反编译 .NET 程序集,因此部署程序集是不安全的,即使是混淆的。

这个问题的回答,我想看看从97版到现代版的C++标准是怎么解决的。

有两种方法可以进一步分离接口和实现。抽象接口:

class IRighteous
{
public:
    virtual void Eat(Food* food) = 0;
    virtual void Pray(Orison* orison) = 0;
    virtual void Love(People* person) = 0;
    virtual ~IRighteous() {}
};

PIMPL:

class Righteous
{
public:
    void Eat(Food* food);
    void Pray(Orison* orison);
    void Love(People* person);

    Righteous(); // To construct RighteousImpl and assign it to the _impl.
    ~Righteous(); // Destructor needs to be defined in cpp where RighteousImpl is defined or included.
private:
    std::unique_ptr<RighteousImpl> _impl;
};