尝试访问 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)->coordinates
是shared_ptr
指向的Character
的坐标。 (注意 ->
,因为我们还必须取消引用 shared_ptr
。)
no match for 'operator[]
发生这种情况是因为您正试图将迭代器当作索引来使用。你可以清楚地看到下面的代码有什么问题:
char[] example = "hello, world\n";
char* ptr = &example[0];
example[ptr]; // wait, what?
我有以下 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)->coordinates
是shared_ptr
指向的Character
的坐标。 (注意 ->
,因为我们还必须取消引用 shared_ptr
。)
no match for 'operator[]
发生这种情况是因为您正试图将迭代器当作索引来使用。你可以清楚地看到下面的代码有什么问题:
char[] example = "hello, world\n";
char* ptr = &example[0];
example[ptr]; // wait, what?