有没有一种方法可以使用派生 class 中的数据调用基 class 指针的方法?
Is there a way to call method with base class pointer that uses the data in derived class?
(抱歉我的英语不好)
我有一个基础 class,其中包含 Drawable 对象上的指针向量,以及使用来自该向量的数据的方法 draw()。
class GameObject
{
protected:
std::vector<Drawable*> drawable;
...
void GameObject::draw() { for (const auto& object : drawable) window.draw(*object); }
在派生的 classes 中,我希望能够添加一些 Drawable 对象
class Player : public GameObject
{
protected:
RectangleShape shape;
...
Player::Player(float x, float y, float z)
{
shape.setPosition [...]
drawable.push_back(&shape);
...
并使用基class指针
的方法绘制它们
std::vector<GameObject*> gameObjects;
...
for (auto& gameObject : gameObjects) gameObject->draw();
程序崩溃(我想是因为基class对派生class中的矢量数据一无所知)。
我知道我可以使这个方法成为纯虚拟的并在派生的 classes 中定义它,但这并不方便。也许还有另一种更类似于此的方式?
更新:
Level::Level()
{
player = Player(500.f, 500.f); //Player player; in header file
gameObjects.push_back(&player);
}
void Level::display()
{
for (auto gameObject : gameObjects) gameObject->draw();
}
问题出在您编辑添加的代码中 - 看起来我的 crystal 球今天工作正常。
您正在创建一个临时 Player
并将其移动到 player
成员变量中。最终得到一个向量,其中包含临时 Player
中 shape
的地址,它立即被销毁,留下一个悬空指针。
使用 ctor-initializer-list 避免移动:
Level::Level()
: player(500.f, 500.f /* where did Z go? */)
{
gameObjects.push_back(&player);
}
并禁用赋值运算符以防止在其他地方不小心这样做:
class Player
{
// ...
Player& operator=(const Player&) = delete;
Player& operator=(Player&&) = delete;
};
(抱歉我的英语不好)
我有一个基础 class,其中包含 Drawable 对象上的指针向量,以及使用来自该向量的数据的方法 draw()。
class GameObject
{
protected:
std::vector<Drawable*> drawable;
...
void GameObject::draw() { for (const auto& object : drawable) window.draw(*object); }
在派生的 classes 中,我希望能够添加一些 Drawable 对象
class Player : public GameObject
{
protected:
RectangleShape shape;
...
Player::Player(float x, float y, float z)
{
shape.setPosition [...]
drawable.push_back(&shape);
...
并使用基class指针
的方法绘制它们std::vector<GameObject*> gameObjects;
...
for (auto& gameObject : gameObjects) gameObject->draw();
程序崩溃(我想是因为基class对派生class中的矢量数据一无所知)。 我知道我可以使这个方法成为纯虚拟的并在派生的 classes 中定义它,但这并不方便。也许还有另一种更类似于此的方式?
更新:
Level::Level()
{
player = Player(500.f, 500.f); //Player player; in header file
gameObjects.push_back(&player);
}
void Level::display()
{
for (auto gameObject : gameObjects) gameObject->draw();
}
问题出在您编辑添加的代码中 - 看起来我的 crystal 球今天工作正常。
您正在创建一个临时 Player
并将其移动到 player
成员变量中。最终得到一个向量,其中包含临时 Player
中 shape
的地址,它立即被销毁,留下一个悬空指针。
使用 ctor-initializer-list 避免移动:
Level::Level()
: player(500.f, 500.f /* where did Z go? */)
{
gameObjects.push_back(&player);
}
并禁用赋值运算符以防止在其他地方不小心这样做:
class Player
{
// ...
Player& operator=(const Player&) = delete;
Player& operator=(Player&&) = delete;
};