我是新手使用矢量......我今天才开始研究它们。我正在尝试为我的敌人类创建一个向量,以便我可以动态创建它们,但我似乎无法弄清楚如何使用类函数...
这是班级......
class Enemy
{
private:
SDL_Surface *enemy;
public:
Enemy();
~Enemy();
enum Direction { UP, DOWN, LEFT, RIGHT } direction;
SDL_Rect position;
bool alive;
int setAttributes(int x, int y, int w, int h);
void update();
bool checkCollision();
};
然后我想为游戏中的敌人创建一个向量...
vector<Enemy> enemy;
然后我尝试像这样调用类函数......
enemy->setAttributes(0, 50, 32, 32);
enemy->update();
但是当我编译时,我得到以下错误......
~/code/cpp/sdl$ g++ -o name main.cpp game.cpp player.cpp bullet.cpp enemy.cpp level.cpp -lSDL -lSDL_image -lSDL_ttf -lSDL_mixer
level.cpp: In constructor ‘Level::Level()’:
level.cpp:14: error: base operand of ‘->’ has non-pointer type ‘std::vector<Enemy, std::allocator<Enemy> >’
level.cpp: In member function ‘void Level::update()’:
level.cpp:28: error: base operand of ‘->’ has non-pointer type ‘std::vector<Enemy, std::allocator<Enemy> >’
我在这里做错了什么?
答案 0 :(得分:1)
向量不是指针(并且不像一个指针),因此没有定义operator->
。使用Enemy
s的向量就像使用带有下标运算符的数组:
std::vector<Enemy> enemies;
enemies.push_back(Enemy());
enemies[0].update();
您可以在数组上使用operator->
的原因是数组转换为指针,因此
Enemy enemies[5];
enemies->update();
相当于
Enemy enemies[5];
(*enemies).update();
又相当于
Enemy enemies[5];
enemies[0].update();
然而,仅仅因为这是可能的并不意味着它是一个好主意:如果您编写enemies[0].update()
而不是enemies->update()
,人们在理解您的代码时会遇到更少的麻烦。
如果你想通过指向数组的指针尽可能地通过vector<Enemy>
,你应该这样做
for (std::vector<Enemy>::iterator it = enemies.begin(); it < enemies.end(); ++it) {
it->update();
}
如果你正在使用C ++ 11并且是懒惰的,你可以编写auto
而不是std::vector<Enemy>::iterator
,编译器会为你找出类型。 (您可能还希望将enemies.end()
的值存储在循环之外,这样您就不会在每次迭代时调用该函数,但无论如何都可以优化它。)
答案 1 :(得分:0)
enemy->setAttributes(0, 50, 32, 32);
enemy->update();
需要
enemy[0].setAttributes(0, 50, 32, 32); // Assuming you have at least one object stored in the vector
enemy[0].update();
请注意,vector元素不是指向对象的指针,而是指向对象本身。