如何在向量中包含派生类型

How to contain derived types in a vector?

本文关键字:包含 派生 类型 向量      更新时间:2023-10-16

我正在用C++制作一个游戏,我希望我的game类能容纳所有的GameObjects。它有一个抽象基本GameObject类的向量,但为了保持派生类型,它必须是指向GameObject:的指针向量

// Game.h
class Game {
private:
    std::vector<GameObject*> gameObjects;
public:
    void addGameObject(GameObject* gameObject) {
        gameObjects.push_back(gameObject);
    }
}

当我想将GameObjects添加到向量中时,就会出现问题。当我将指针传递给addGameObject时,指针在另一个作用域中变为NULL。因此,我希望指针存储在向量中,但之后不会立即变为NULL。我不知道该怎么解决这个问题。有什么想法吗?

编辑:谢谢大家的评论。我使用C++已经有一段时间了,但我对使用指针还很陌生,还没有完全理解它们。我知道你需要使用它们来创建包含派生对象的向量。我想我需要更多地研究指针。

"当我想将GameObject添加到向量中时,就会出现问题。当我将指针传递给addGameObject时,指针在其他范围中变为NULL。"

我不知道为什么这些指针在另一个作用域中变成NULL,因为您没有提到足够的上下文来证明这一点。

但我认为更好的选择似乎是使用像这样的智能指针

// Game.h
class Game {
private:
    std::vector<std::shared_ptr<GameObject>> gameObjects;
public:
    void addGameObject(std::shared_ptr<GameObject> gameObject) {
        gameObjects.push_back(gameObject);
    }
}

智能指针有更多的选择,这取决于它们的实际用例,即std::unique_ptr<GameObject>std::weak_ptr<GameObject>

std::shared_ptr<GameObject>(或其他提到的智能指针变体)应该很好地用于从GameObject类派生的实例,例如

class Player : public GameObject {
    // ...
};

这将管理对GameObject实例的引用,因为它们正在使用中,或者在任何范围内都拥有。