【发布时间】:2016-01-13 05:36:15
【问题描述】:
我有一个包含指针的类。我想阻止类的用户访问指针的地址(所以他们不能将它设置为另一个地址,删除它,或者什么不)。但是,我希望用户能够修改指针数据(或成员数据,如果它不是 POD)以及调用指针的方法(假设它有任何方法)。
是否有任何方法可以返回指针或引用,使您可以更改指针指向的 数据 而无法更改 指针值本身?
所以:
class A
{
public:
int Value;
void Method();
};
class Wrapper
{
public:
Wrapper()
{
Pointer = new A;
}
// Method that somehow would give access to the object without
// Allowing the caller to access the actual address
A* GetPointer()
{
return Pointer;
}
private:
A* Pointer;
};
int main()
{
Wrapper foo;
foo.GetPointer()->Value = 12; // Allowed
foo.GetPointer()->Method(); // Allowed
A* ptr = foo.GetPointer(); // NOT Allowed
delete foo.GetPointer(); // NOT Allowed
return 0;
}
我意识到我可以使用 getter 和 setter 修改成员数据,但我不确定如何处理这些方法(可能传递一个方法指针?)我想知道在我之前是否有更好的方法接受我个人认为看起来很混乱的解决方案。
【问题讨论】:
-
嗯,用你提到的 getter 和 setter 修改它是封装私有数据的重点,这听起来像你想要做的......也就是说,允许访问和更新值,但在类中保留和管理对该数据的控制。
-
确切地说,我只是不确定调用封装对象的方法,是否必须将方法指针传递给内部调用它的函数,或者是否有其他更好的方法.
-
我想让类的用户不能访问指针的地址 -- 为什么
Pointer必须是指针?为什么不将A对象作为成员?那么delete就没什么了或者改地址了。 -
我质疑您是否需要允许
foo.GetPointer()->Value = 12;但不允许A* ptr = foo.GetPointer();。目前尚不清楚您要保护什么。请记住,坚定的程序员可能会破坏您精心设计的访问控制。 -
@5gon12eder 我害怕那个。我一直在努力“保护”我的代码,以至于我忘记了 C++ 编码器是 C++ 编码器 因为 他们不是儿童.