我在创建对象和使用向量而不是数组使用类函数时遇到了麻烦......我做错了什么?

时间:2012-01-05 02:52:28

标签: c++ vector sdl

我是新手使用矢量......我今天才开始研究它们。我正在尝试为我的敌人类创建一个向量,以便我可以动态创建它们,但我似乎无法弄清楚如何使用类函数...

这是班级......

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> >’

我在这里做错了什么?

2 个答案:

答案 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元素不是指向对象的指针,而是指向对象本身。