这是我的问题。
我有一个包含对象数组的类(在std :: vector中) 这些对象可以从客户端代码修改,所以我创建了一个私有getter,它返回一个指向我需要修改的对象的指针。 public方法使用此getter来修改数组中的对象。
私有getter也用于其他成员函数,它们将数组中对象的某些特定值返回给客户端代码。我希望这些函数能够并返回const,但我不能这样做,因为我使用前面提到的非const getter。
我知道我可以制作另一个const getter,但这只会重复代码。
如何正确实现?
代码示例:
class Object;
class Inventory
{
Object* GetObject(int id);
void AddObjectProp(int id, int amount) {
Object* x = GetObject id);
x->prop += amount;
}
//using const here is not posible because GetObject is not const
int GetObjectProp(int id) {
Object* x = GetObject id);
return x->prop;
}
}
谢谢。
答案 0 :(得分:3)
我知道你说你不想这样做,但最干净的解决方案是使用两个吸气剂:
class Inventory
{
Object* GetObject(int id);
const Object* GetObject(int id) const;
void AddObjectProp(int id, int amount) {
Object* x = GetObject(id);
}
int GetObjectProp(int id) const {
const Object* x = GetObject(id);
}
};
至于复制GetObject()
实现,您可以
答案 1 :(得分:2)
我相信你可以做一个
const Object* GetObject(int id) const;
然后你可以:
int GetObjectProp(int id) const {
const Object* x = GetObject(id);
return x->prop;
}
或者:
int GetObjectProp(int id) const {
return GetObject(id)->prop;
}
(还修复了GetObject()
中“id”之前缺少的括号
答案 2 :(得分:0)
我不认为拥有双重吸气剂可以被视为代码重复。 两个getter都有自己的用例。
一个getter旨在供需要const引用的客户端使用。
另一个getter(我称之为访问器,在我们正在寻找非const引用的代码中使其明确)是任何可能愿意修改该对象的客户端使用的。
这将是我的方法:
class Inventory
{
Object& accessObject(int id);
const Object& getObject(int id) const;
...
};
如果你真的不想要两个getter,那么在需要的情况下可以使用const_cast
来释放const的单个const getter呢?