避免在c++头文件中声明私有字段

本文关键字:声明 字段 文件 c++ | 更新日期: 2023-09-27 18:14:55

当我成为c#爱好者时,我对c++有点失望,因为我相信它的祖先比它的前身更好地解决了我要调用的接口问题。问题是,您无法在类定义中摆脱私有字段声明,因此在其中封装对我来说似乎不那么诚实。例如:

// 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和部署头和库而不泄露你的肮脏的秘密。

c#的元类信息很好,尽管现在使用文本编辑器(如notepad或emacs)提取类定义并不方便。此外,c#反射工具允许任何人完全反编译。net程序集,因此部署程序集是不安全的,甚至是混淆的。

为了回答这个问题,我想看看从97到现代版本的c++标准是如何解决的。

避免在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;
};