C++:在不破坏封装的情况下将指针用作私有成员变量?

C++: Using pointers as private member variables without breaking encapsulation?

我有一个 class 电影,其中包含一个整数指针 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 将输出转换回原样即可恢复测量值。因为下面允许邪恶指针从外部改变电影数据:

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 * 作为我的 constructor/setter 的参数,它仍然将 int * 对象作为 main 中的参数,这使得 const 关键字基本上是多余的.

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

你需要明白'gun safety switch'中的封装是保护,而不是'strong cryptography'中的。你不应该担心 class 用户使用 returned const pointerconst_cast 的可能性,就像你担心他们在包含你的之前输入类似 #define private public 的东西一样header class.

在 C++ 中,故意破坏封装的可能性是无限的,无论是否有外部行为。相反,封装试图保护 class 的用户免受无辜错误的影响。

在您的特定情况下,您需要 const-qualify 您的 getter 函数和 return const int*。或者,由于您已经拥有琐碎的 getter 和设置器,您可以取消它们并简单地声明您的成员 public 具有相同的封装级别。