C ++:使用指针作为私有成员变量而不破坏封装吗?

时间:2018-11-29 17:33:39

标签: c++ oop pointers encapsulation

我有一个Film类,它包含一个整数指针Chapitres和该数组Count_chapitres的元素数量。

 class film : public video
{
private:
    int* Chapitres;
    unsigned int Count_chapitres;
public:
    film();
    film(int* Chapitres, unsigned int Count_Chapitres, int Duree, string Name, string Filename);
    virtual ~film();
    void setChapitres (int * Chapitres, unsigned int Count_Chapitres);
    int * getChapitres() const;
    unsigned int getCountChapitres() const;
    void printOut (ostream & Display) const;

};

一个明显的问题是,放弃指针将破坏封装。

1)我尝试将get的输出设置为const int *,在该输出中,只需使用 const_cast 强制将输出强制回退即可。如下所示,Evil指针可以从外部更改电影数据:

film* file2 = new film(Chaps, 3, 5, "hany", "daher");

    file2->printOut(cout);
    int * Evil = const_cast<int *>(file2->getChapitres());
    *(Evil +1)=9;
    file2->printOut(cout);

2)同样,即使我将const int *作为构造函数/ setter的参数,它仍然将int *对象作为主参数,使得 const 关键字本质上是多余的。

解决方案显然不在于指向常量值的指针。对如何进行有任何想法吗?

1 个答案:

答案 0 :(得分:3)

您需要了解封装是“枪支安全开关”中的保护,而不是“强密码”中的保护。您不必担心类用户对返回的const_cast执行const pointer的可能性,而不必担心他们在包含标题类之前键入类似#define private public的内容。

在C ++中,有外部行为或没有外部行为的故意破坏封装的可能性是无限的。相反,封装试图保护类的用户免受无害的错误。

在特定情况下,您需要对getter函数进行const限定,然后返回const int*。另外,由于您已经有了一些简单的getter和setter,因此可以删除它们,而只需使用相同的封装级别将您的成员声明为public。