防止对作为指针返回的对象的更改

时间:2012-06-11 15:13:03

标签: c++ const

我有一个返回指向对象的指针的函数。像这样:

class SomeClass
{
public:
    Object* getObject() const { return &obj; };
private:
    Object obj;
}

问题是我没有调用函数来更改返回的对象,它可能调用在内部对其进行操作的函数,但是不要更改SomeClass中的 obj ... 一个例子可能更容易理解:

- 如果函数返回指向const对象const Object* getObject() const的指针,则调用函数不能使用对象的非const方法(但我希望它们能够)。

- 如果我只是返回指针,调用函数可能会改变对象:

Object* pointer = sclass.getObject();
*pointer = Object();

所以 sclass 中的对象现在是一个不同的对象(我不想发生)。

有解决方法吗?

4 个答案:

答案 0 :(得分:9)

tl; dr版本:返回const Object *

  

如果函数返回指向const对象const Object* getObject() const的指针,则调用函数将无法使用对象的非const方法(但我希望它们能够使用)。

但这是const的全部要点 - 正确性!任何不修改对象的可观察状态的Object方法都应声明为const。如果你对此保持一致,那么你的问题就会消失。如果你一致,那么整个事情就会崩溃(这可能是你问题的原因!)。

显然,你不能对const方法采取任何措施,然后通过抛弃const的{​​{1}}来解决问题,但这总是一个问题。

答案 1 :(得分:2)

如果您不希望用户能够修改对象,请返回指向const对象的指针。

假设你的对象是const-correct,这意味着他们将能够做任何不修改对象的事情。如果不是这种情况,那么你想修复const-correctness问题,以便成为案例(例如,所有不修改对象的成员函数都被标记为const)。

答案 2 :(得分:1)

正如上面其他几个人所指出的,如果Object API没有强制执行const正确性,则无法阻止客户端函数对其进行修改。到目前为止,理想的面向对象设计。

唯一的解决方法(我不会自己做)可能是从getObject()方法中返回对象的副本。

Object* getObject() const { Object* o = new o(obj); return o; };

但这会带来不必要的头痛,比如你必须要处理删除等问题。但是,它符合你的要求,即原始的obj变量没有被修改。

答案 3 :(得分:0)

我只是意识到你可以吃蛋糕并吃掉它...只要你能控制Object类的实施。

在您的特定示例中,如果为operator=()禁用了赋值运算符(Object),则表达式

*pointer = Object();

变得无效。

注意:当然,此决策的影响大于SomeClass::getObject():代码的其他任何部分都无法将Object s的实例分配给彼此。你必须决定这个限制是否值得你

注意:要禁用operator=,请将其声明为private(并且不需要实施):

class Object
{
  // ... current member declarations/definitions
  private:
    Object& operator=(const Object&); // no implementation
};