getter的c ++ const正确性问题

时间:2013-01-24 16:13:16

标签: c++ class const

这是我的问题。

我有一个包含对象数组的类(在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;
    }    

}

谢谢。

3 个答案:

答案 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呢?