gpt4 book ai didi

c++ - C++ 中的多态性,带有基类和 reference_wrapper 的 vector

转载 作者:行者123 更新时间:2023-11-28 06:01:56 25 4
gpt4 key购买 nike

我需要在 C++ 中对存储在 vector 中的对象使用多态性。

从其他问题了解到 vector 中的对象需要通过引用存储,否则会发生对象切片。

我的理解是 std::reference_wrapper 很合适,但我在实现它时遇到了一些问题。

ActorRecordingItem 是基类,ActorVehicleEnterRecordingItem 是需要多态性的类的示例(通过 ActorVehicleRecordingItem 从 ActorRecordingItem 继承)

    class ActorRecordingItem {
protected:
DWORD m_ticksAfterRecordStart;
Ped m_actorPed;
Vector3 m_location;
DWORD m_ticksDeltaCheckCompletion;
public:
ActorRecordingItem(DWORD ticksStart, Ped actorPed, Vector3 location);
virtual void executeNativesForRecording(Actor actor);
virtual bool isRecordingItemCompleted(Actor actor, Vector3 location);
virtual std::string toString();
};

class ActorVehicleEnterRecordingItem : public ActorVehicleRecordingItem {
protected:
int m_vehicleSeat;
float m_enterVehicleSpeed;
public:
ActorVehicleEnterRecordingItem(DWORD ticksStart, Ped actor, Vector3 location, Vehicle veh, int vehicleSeat,float enterVehicleSpeed);
std::string toString() override;
void executeNativesForRecording(Actor actor) override;
bool isRecordingItemCompleted(Actor actor, Vector3 location) override;
};

包含需要多态性的对象的 vector 存储在另一个类 Actor 中。目前定义为

class Actor
{
private:
std::vector<std::reference_wrapper<ActorRecordingItem>> m_actorRecordingItems;
public:
Actor();
Actor(Ped ped);
void setRecording(std::vector<std::reference_wrapper<ActorRecordingItem>> actorRecordingItems);
std::vector<std::reference_wrapper<ActorRecordingItem>> getRecording();
std::reference_wrapper<ActorRecordingItem> getRecordingAt(int index);
};

随着关键方法的实现

void Actor::setRecording(std::vector<std::reference_wrapper<ActorRecordingItem>> actorRecordingItems)
{
m_actorRecordingItems = actorRecordingItems;
}

std::vector<std::reference_wrapper<ActorRecordingItem>> Actor::getRecording()
{
return m_actorRecordingItems;
}

std::reference_wrapper<ActorRecordingItem> Actor::getRecordingAt(int index)
{
return m_actorRecordingItems[index];
}

actorRecordingItems 在单独的方法中创建并分配给 Actor 。这是通过

std::vector<std::reference_wrapper<ActorRecordingItem>> actorRecording;
actorRecording.reserve(1000);

ActorVehicleEnterRecordingItem recordingItem(ticksSinceStart, actorPed, actorLocation, actorVeh, seat, enterSpeed );
actorRecording.push_back(recordingItem);

actor.setRecording(actorRecording);

最后是我想使用它们并需要多态性的位置。

std::reference_wrapper<ActorRecordingItem> recordingItem = actor.getRecordingAt(recordingPlayback.getRecordedItemIndex());

recordingItem.get().executeNativesForRecording(actor);

最后一行似乎导致程序崩溃。我真的不知道从哪里开始研究这个问题,所以非常感谢任何帮助

PS 很抱歉这个问题很长 :)

最佳答案

问题出在这几行:

ActorVehicleEnterRecordingItem recordingItem(ticksSinceStart, actorPed, actorLocation, actorVeh, seat, enterSpeed );
actorRecording.push_back(recordingItem);

此处发生的事情是您创建了一个局部变量并将对该局部变量的引用推送到 vector 。一旦变量 recordingItem 引用失效超出范围。 std::reference_wrapper顾名思义,它是引用的包装器,不对资源进行任何类型的管理。您可以通过使用 std::unique_ptr 的 vector 来避免此问题。 , std::shared_ptr或者如果你想避免为每个元素动态分配 - boost::variant<> (在这种情况下,您需要指定 vector 中可能存在的所有潜在类型)。

关于c++ - C++ 中的多态性,带有基类和 reference_wrapper 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33110013/

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