尝试访问 shared_ptr 的向量时运算符 [] 出现问题

problem with operator[] when trying to access a vector of shared_ptr

我有以下 class :

class Character
{
     /unimportant code
}
class Fighter : public Character
{
     /unimportant code
}
class Healer: public Character
{
     /unimportant code
}


class Game
{
public:
    void move(const GridPoint & src_coordinates,  const GridPoint & dst_coordinates);
    //there are more things here ,but they're not important for the sake of this question. 
private:
    int height;
    int width;
    std::vector<std::shared_ptr<Character>> gameboard;
};


void move(const GridPoint & src_coordinates,  const GridPoint & dst_coordinates)
{
    for (std::vector<std::shared_ptr<Character>>::iterator i = gameboard.begin(); i != 
                                                                  gameboard.end() ; i++ )
    {
        if ( (*gameboard[i]).coordinates == src_coordinates)
        {
            //do I need to implement my own [] operator?
        }
           
        
    }
        
}

我正在尝试遍历我的游戏板并将角色从 src_coordinates 移动到 dst_coordinates。 Character 也是一个 class 被更多人继承的 :

当我尝试访问 gameboard[i] 的元素时出现以下错误:

no match for 'operator[] (operand types are 'std::vector<std::shared_ptr<Character> >' and 'std::vector<std::shared_ptr<Character> >::iterator' {aka '__gnu_cxx::__normal_iterator<std::shared_ptr<Character>*, std::vector<std::shared_ptr<Character> > >'}

这是否意味着我必须实现自己的 operator[] 和 operator* 因为 Character 是我自己的 class?我该如何解决我的问题?

迭代器是指针的概括。您使用 * 从指针中获取指向的东西;您使用 * 获取迭代器当前“指向”的容器元素。迭代器类型使用运算符重载,因此即使底层容器不是简单数组,它也可以像指针一样工作。

std::vector<std::shared_ptr<Character>>::iterator

这个 的意思是 :“当你对它应用 * 时,它会给你一个 std::shared_ptr<Character> 来自 std::vector<std::shared_ptr<Character>>(以及其他有用的属性)”。

每次循环,*i 是向量中的 std::shared_ptr<Character> 之一。因此,(*i)->coordinatesshared_ptr指向的Character的坐标。 (注意 ->,因为我们还必须取消引用 shared_ptr。)

no match for 'operator[]

发生这种情况是因为您正试图将迭代器当作索引来使用。你可以清楚地看到下面的代码有什么问题:

char[] example = "hello, world\n";
char* ptr = &example[0];
example[ptr]; // wait, what?