1

这是我的问题。

我有一个包含对象数组的类(在 std::vector 中)这些对象可以从客户端代码修改,所以我创建了一个私有 getter,它返回指向我需要修改的对象的指针。公共方法使用此 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;
    }    

}

谢谢你。

4

3 回答 3

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()实现,您可以

  • 排除大部分代码;或者
  • 根据另一个实现一个吸气剂。
于 2013-01-24T16:18:28.103 回答
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;
}    

(还修复了“id”之前缺少的括号GetObject()

于 2013-01-24T16:18:03.403 回答
0

我不认为在这里有一个双重吸气剂可以被视为代码重复。两个吸气剂都有自己的用例。

一种 getter 旨在供需要 const 引用的客户使用。

另一个 getter(我将其称为访问器,以使其在我们正在寻找非 const 引用的代码中明确表示)供任何可能愿意修改对象的客户端使用。

这将是我的方法:

class Inventory
{
   Object& accessObject(int id);
   const Object& getObject(int id) const;

   ...
};

如果您真的不想拥有两个 getter,那么在const_cast需要时可以使用单个 const getter 来抛弃 constness 怎么样?

于 2013-01-24T16:32:23.410 回答