我在创建对象并使用向量而不是数组使用它们的类函数时遇到问题......我做错了什么?

I'm having trouble creating objects and using their class functions using vectors instead of arrays...What am I doing wrong?

本文关键字:类函数 遇到 问题 什么 错了 数组 创建对象 向量      更新时间:2023-10-16

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

这是类...

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

我在这里做错了什么?

量不是指针(并且不像指针(,因此没有定义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()的值存储在循环之外,这样您就不会在每次迭代时都调用该函数,但这无论如何都可以优化(。

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();

请注意,矢量元素不是指向对象的指针,而是指向对象本身。