我有一个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 关键字本质上是多余的。
解决方案显然不在于指向常量值的指针。对如何进行有任何想法吗?
答案 0 :(得分:3)
您需要了解封装是“枪支安全开关”中的保护,而不是“强密码”中的保护。您不必担心类用户对返回的const_cast
执行const pointer
的可能性,而不必担心他们在包含标题类之前键入类似#define private public
的内容。
在C ++中,有外部行为或没有外部行为的故意破坏封装的可能性是无限的。相反,封装试图保护类的用户免受无害的错误。
在特定情况下,您需要对getter函数进行const限定,然后返回const int*
。另外,由于您已经有了一些简单的getter和setter,因此可以删除它们,而只需使用相同的封装级别将您的成员声明为public。