在不显示指针地址的情况下访问指针的数据

时间:2016-01-13 05:36:16

标签: c++ pointers constants

我有一个包含指针的类。我希望让类的用户不要访问指针的地址(因此他们不能将它设置为另一个地址,删除它,或者什么不是)。但是,我希望用户能够修改指针数据(或成员数据,如果它不是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来修改成员数据,但是我不知道如何处理这些方法(可能会传递一个方法指针?)并且我想知道是否存在在接受我个人认为看起来很混乱的解决方案之前,更好的方法。

2 个答案:

答案 0 :(得分:1)

这是不可能的。 ->Value合法的全部原因是因为左边的表达式是指向A*的(智能)指针。

显然,使用非智能指针,您已经拥有了A*。由于原始指针不是用户定义的类型,因此无法解决重载决策问题。

使用智能指针,(*ptr).Value必须正常工作。这意味着您必须从A&返回operator*,这反过来意味着&(*ptr)从智能指针获取拖网指针。

对于试图阻止std::addressof的类,甚至会operator&

答案 1 :(得分:-1)

你可以制作一个getter,它返回对象的引用,例如:

A &GetObject()
{
    return *Pointer;
}

这允许完全访问指向的对象,而根本不提供对指针本身的访问。