允许在不泄露指针地址的情况下访问指针的数据
Give Access to a Pointer's Data Without Revealing Pointer Address
我有一个包含指针的类。我想阻止类的用户访问指针的地址(这样他们就不能将其设置为另一个地址、删除它或其他什么)。但是,我希望用户能够修改指针数据(或成员数据,如果它不是 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 修改成员数据,但我不确定如何处理这些方法(也许传递方法指针?),我想知道在我接受我个人认为看起来很混乱的解决方案之前是否有更好的方法。
这
是不可能的。->Value
合法的全部原因是因为左侧的表达式是指向A*
的(智能)指针。
显然,使用非智能指针,您已经拥有了A*
。由于原始指针不是用户定义的类型,因此不能弄乱重载分辨率。
有了智能指针,(*ptr).Value
必须工作。这意味着您必须从operator*
返回一个A&
,这反过来意味着&(*ptr)
从智能指针获取 traw 指针。
对于试图阻止operator&
的类,甚至还有std::addressof
。
你可以做一个getter 这返回对对象的引用,例如:
A &GetObject()
{
return *Pointer;
}
这允许完全访问指向的对象,而无需提供对指针本身的访问。
相关文章:
- CUDA:统一内存和指针地址的更改
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 向指针地址添加 20 个字节偏移量
- 如何理解智能指针的底层指针地址?
- 初学者问题:C++指针/地址 - 和变量之后不是以前?
- 返回数组中值的指针地址
- C++向指针地址添加 4 个字节
- 指针地址的内存偶尔更改了函数前和后返回
- 如何根据指针地址获取指针内容
- C++ 将指针地址传递给函数
- 直接从指针/地址访问数组的元素
- 如何在没有作弊引擎的情况下从其他应用程序获取指针地址?
- 如何保存指针地址,以便另一个指针可以继续处理它
- 间接寻址运算符如何返回带有运算符重载的指针地址
- 使用已删除的指针地址.据我所知,
- 如何保护类外用户可以修改的指针地址?C++
- 多个调用构造函数将更改C 中的成员指针地址
- 类对象指针的向量:如何在指针地址获得价值?C 和SDL_RECT
- Visual Studio C 2K15-在指针地址上获取错误
- 指针地址和参考混乱