gpt4 book ai didi

c++ - 如何正确使用指针 vector ?

转载 作者:行者123 更新时间:2023-11-30 03:26:38 25 4
gpt4 key购买 nike

我正在制作小型模拟应用程序,基类名为 Entity,子类名为 Herbivore 和 Carnivore。因为我使用的是 SFML,所以我需要更新它们,处理交互等等。我的第一个想法是将它们存储在两个不同的 vector 中,但我想这不是最有效的解决方案。

然后我尝试使用一点多态性,但在这里我完全失败了。我有一个指向实体对象的指针 vector 。这是它的声明:

std::vector<Entity*> entityVector;

在创建新对象时,我从不同的类调用函数:

void ObjectFactory::createHerbivore(Sprite sprite, Vector2f position, 
std::vector<Entity*> *vector)
{
Herbivore herbivore(sprite, position, m_GameResolution);
Entity* p_herbivore = &herbivore;
vector->push_back(p_herbivore);
}

下面是我在主 Game 类中调用该函数的方式:

        //Creating new herbivore objects
if (inputEvent.key.code == Keyboard::H)
{
srand((int)time(0) * dt.asMilliseconds() + 1 * 800 * entityVector.size() + 5);
herbivorePosition.x = rand() % (int)videoResolution.x;
herbivorePosition.y = rand() % (int)videoResolution.y;
factory.createHerbivore(herbivoreSprite, herbivorePosition, &entityVector);
(entityVector.back())->setDangerSprite(dangerSprite);
}

然后我继续处理该 vector ,或者至少尝试这样做,但它在第一次尝试读取保存在该指针下的数据时崩溃。当然,通过我意识到的痛苦而漫长的调试过程,我在这里创建了一个新对象,传递了它的地址,然后通过离开这个函数来销毁它。所以我的问题是:如何处理它,这样我才能保留所有这些甜蜜的多态性?

最佳答案

I've realised, that I create a new object here, pass its address and then destroy it by leaving this function. So my question is: how to deal with it, so I can keep all of this sweet polymorphism?

你可以有一个 vector shared_ptr<Entity>您可以使用类似 make_shared<Herbivore>(sprite, position, m_GameResolution) 的代码创建一个新的动态分配对象.

shared_ptr而不是像 Entity* 这样的原始指针基本上负责清理。当没有更多的时候 shared_ptr s 引用该对象,它会自动销毁并释放内存。我们说它由 shared_ptr 的集合拥有这是指它。

make_shared<Herbivore>而不是例如shared_ptr<Entity>{ new Herbivore{ sprite, position, m_GameResolution } }避免了后者的一些低效率(额外的动态分配),并且还可以帮助避免在函数调用中创建两个或多个此类对象作为实际参数的未定义行为。


例子:

#include <iostream>
#include <typeinfo> // for typeid
#include <memory>
#include <vector>
using namespace std;

struct Entity { virtual ~Entity(){} };
struct Herbivore: Entity {};
struct Carnivore: Entity {};

auto main() -> int
{
vector<shared_ptr<Entity>> entities;
entities.push_back( make_shared<Herbivore>() );
entities.push_back( make_shared<Herbivore>() );
entities.push_back( make_shared<Carnivore>() );
entities.push_back( make_shared<Herbivore>() );

for( auto p: entities )
{
cout << typeid( *p ).name() << endl;
}
}

关于c++ - 如何正确使用指针 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48140943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com