我有一个返回指向对象的指针的函数。像这样:
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 中的对象现在是一个不同的对象(我不想发生)。
有解决方法吗?
答案 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
};