Я пытаюсь написать симуляцию, управляемую событиями, в C++. Сейчас это просто скелетное приоритет очереди unique_ptrs до базового класса Event:Изменение priority_queue unique_ptrs
class Event
{
public:
double time;
Event(double time);
virtual void handle() = 0;
};
struct EventCompare
{
bool operator()(std::unique_ptr<Event> e1, std::unique_ptr<Event> e2) {
return e1->time > e2->time;
}
};
class DumpSimulationEvent : public Event
{
public:
DumpSimulationEvent(const double time);
void handle();
};
typedef std::priority_queue<std::unique_ptr<Event>, std::vector<std::unique_ptr<Event>>, EventCompare> EventQueue;
class Simulation
{
double time;
EventQueue eventQueue;
public:
Simulation();
void run();
};
Event::Event(const double t)
{
time = t;
}
DumpSimulationEvent::DumpSimulationEvent(const double t) : Event(t)
{
}
void DumpSimulationEvent::handle()
{
std::cout << "Event time: " << time;
}
Simulation::Simulation()
{
time = 0;
eventQueue = EventQueue();
std::unique_ptr<DumpSimulationEvent> dumpEvent5(new DumpSimulationEvent(5));
//eventQueue.emplace(dumpEvent5);
}
void Simulation::run()
{
while (!eventQueue.empty()) {
std::unique_ptr<Event> currentEvent = std::move(eventQueue.top());
//eventQueue.pop();
time += currentEvent->time;
currentEvent->handle();
}
}
Основная функция (не показано выше) просто создает экземпляр моделирования и вызывает метод запуска(). Проблема заключается в том, что раскомментировав либо устанавливать() или поп() результаты в
error C2280: 'std::unique_ptr<Event,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 521 1
Исследования показывают, что наиболее вероятной причиной является попытка скопировать unique_ptr. Тем не менее, я теряю, есть ли это фактическая причина и действительно ли это происходит в комментариях или просто становится видимым там. Добавление аргумента std :: move to emplace не помогает.
'станд :: ход (eventQueue.top());' это не получится, как 'priority_queue' только обеспечивает константный доступ к 'top'. См. Http://stackoverflow.com/q/20149471/420683 – dyp
Не причина ошибки, которую вы видите, но класс 'Event' должен иметь деструктор' virtual', иначе UB будет вставлять объекты 'DumpSimulationEvent' в 'unique_ptr' –
Praetorian
Определяет ли определение виртуального деструктора, я должен явно определять деструкторы и перемещать конструкторы для производных классов? – user3157796