您如何在C ++中实现“真实”封装?

问题描述 投票:1回答:4

封装(信息隐藏)是一个非常有用的概念,可确保在类的API中仅发布最起码的最小细节。

但是我不禁想到C ++这样做的方式有点不足。例如,以(基于摄氏温度)的温度类为例:

class tTemp {
    private:
        double temp;
        double tempF (double);
    public:
        tTemp ();
        ~tTemp ();
        setTemp (double);
        double getTemp ();
        double getTempF ();
};

现在,这是一个非常简单的情况,但它说明封装并不完美。 “真实”封装将隐藏all不必要的信息,例如:

  • 数据在内部由temp变量(及其类型)维护的事实。
  • 存在华氏温度/摄氏度转换的内部例程的事实。

因此,理想情况下,在我看来,该类的实现者将使用上面的标头,但该类的任何客户端都只会看到公共位。

[不要误会我,我没有批评C ++,因为它符合防止客户端using私有位的既定目的,但是对于更复杂的类,您可以根据C ++轻松地得出内部细节”私有数据和功能的名称,类型和签名。

C ++如何允许实现者隐藏此信息(假设它[可能])?在C语言中,我只使用不透明类型,以便隐藏内部细节,但是在C ++中如何实现?我想我可以维护一个

separate

类,该类对客户端完全隐藏并且仅对我自己的代码已知,然后在可见类中保留一个带有void *的实例(在我的代码中进行广播) ,但这似乎是一个相当痛苦的过程。在C ++中,有没有更简单的方法可以达到相同的目的?

封装(信息隐藏)是一个非常有用的概念,可确保在类的API中仅发布最起码的最小细节。但是我不禁会以为C ++做到这一点的方法是...
c++ encapsulation
4个回答
8
投票
C ++使用称为“ pimpl”(私有实现/指向实现的指针)的惯用法来隐藏实现细节。请查看this MSDN article了解详细信息。

4
投票
我想充实Don Wakefield在他的评论中提到的“接口类/工厂”技术。首先,我们从接口中提取所有实现细节,并定义一个仅包含Temp接口的抽象类:

0
投票
私有实现(PIMPL)是C ++可以提供此功能的方式。由于我无法使用CygWin g ++ 4.3.4编译unique_ptr变体,因此另一种方法是在可见类中使用void *,如下所示。这将允许您使用C ++ 11之前的编译器,以及上述的gcc之类的编译器,这些编译器仅对C ++ 11具有实验性支持。

0
投票
您在公开的课程中保留了char数组:
© www.soinside.com 2019 - 2024. All rights reserved.