2

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

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中的 Object现在是一个不同的对象(我不想发生这种情况)。

有解决方法吗?

4

4 回答 4

9

tl;博士版本:返回一个const Object *.

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

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

显然,您不能对const通过抛弃 的const-ness 来颠覆事物的方法做任何事情this,但这始终是个问题。

于 2012-06-11T15:16:26.837 回答
2

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

假设您的对象是 const 正确的,这意味着他们将能够做任何不修改对象的事情/所有事情。如果不是这种情况,那么您想修复 const 正确性问题,使其成为这种情况(例如,所有不修改对象的成员函数都被标记const)。

于 2012-06-11T15:17:03.233 回答
1

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

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

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

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

于 2012-06-11T15:26:13.530 回答
0

我刚刚意识到你也可以吃蛋糕……前提是你可以控制Object类的实现。

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

*pointer = Object();

变为无效。

注意:当然,这个决定的影响不仅仅是SomeClass::getObject():代码的任何其他部分都不能将Objects 的实例相互分配。你必须决定这个限制是否值得你

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

class Object
{
  // ... current member declarations/definitions
  private:
    Object& operator=(const Object&); // no implementation
};
于 2012-06-12T00:51:52.560 回答