我正在用C ++制作游戏,我希望我的Game类可以容纳所有的GameObjects。它有一个抽象基类GameObject类的向量,但为了保存派生类型,它必须是指向GameObjects的指针向量:
// Game.h
class Game {
private:
std::vector<GameObject*> gameObjects;
public:
void addGameObject(GameObject* gameObject) {
gameObjects.push_back(gameObject);
}
}
当我想将GameObjects添加到向量时,会出现问题。当我传入一个指向addGameObject的指针时,指针在另一个范围内变为NULL。所以我希望指针存储在向量中,但之后不会立即变为NULL。我不知道如何解决这个问题。有什么想法吗?
编辑:谢谢大家的评论。我已经使用了一段时间的C ++,但我不熟悉使用指针并且还没有完全理解它们。我知道您需要使用它们来创建包含派生对象的向量。我想我需要更多地研究指针。
答案 0 :(得分:1)
&#34;当我想将GameObjects添加到向量时,会出现问题。当我传入一个指向addGameObject的指针时,指针在另一个范围内变为NULL。&#34;
我无法说明为什么这些指针在另一个范围内成为NULL
,因为您没有提到足够的背景来证明这一点。
但我认为更好的选择似乎是使用这样的smart pointer
// 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
实例的引用,因为它们正在使用中,或者属于任何范围。