避免将私有字段声明放入c ++标头中

时间:2015-09-29 10:44:50

标签: c# c++ encapsulation

当我成为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#元类信息很不错,但现在使用文本编辑器(如记事本或emacs)提取类定义并不方便。此外,C#反射工具允许任何人完全反编译.NET程序集,因此部署程序集是不安全的,甚至是模糊的。

在回答这个问题时,我想看看从第97版到现代版的C ++标准是如何解决的。

1 个答案:

答案 0 :(得分:5)

有两种方法可以进一步将界面与实现分开。抽象界面:

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;
};