- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要在 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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!