Я работаю над проектом по преобразованию некоторого кода из языка моделирования MODSIM в C ++ и наткнулся на то, что мне трудно понять.
Пример кода:
PlaneQueueObj = OBJECT(QueueObj[ANYOBJ:PlaneObj])
Это означает, что мы объявляем class PlaneQueueObj
который наследуется от QueueObj
, который позволяет только объекты class PlaneObj
или классы, полученные из PlaneObj
в очередь. (Классы называются объектами на этом языке …)
Я хочу знать, как это можно реализовать в C++
,
Это может быть действительно очевидно, и я просто запутался, но я новичок здесь, так что успокойся.
Я думаю, что вы просто ищете, std::queue<std::unqiue_ptr<PlaneObj>>
,
то есть
std::queue<std::unique_ptr<PlaneObj>> queue;
queue.push(new PlaneObjType1());
queue.push(new PlaneObjType2());
queue.push(new PlaneObjType3());
Будет ли что-то подобное сделать это?
Я полагаю, что ваша очередь делает что-то особенное, поэтому вам нужно реализовать ее самостоятельно.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я никогда не писал шаблоны, поэтому я могу быть совершенно неправ;)
#include <vector>
#include <iostream>
template<typename T>
class QueueObj
{
private:
std::vector<T> queue;
public:
void Enqueue(const T &t)
{
queue.push_back(t);
}
T Dequeue()
{
T t = queue.back();
queue.pop_back();
return t;
}
};
class PlaneObj
{
public:
virtual void Print()
{
std::cout<<"PlaneObj"<<std::endl;
}
};
class PlaneObjDerived : public PlaneObj
{
public:
virtual void Print()
{
std::cout<<"PlaneObjDerived"<<std::endl;
}
};
class PlaneQueueObj : public QueueObj<PlaneObj*> {};
int main()
{
PlaneQueueObj queue;
PlaneObjDerived *po1 = new PlaneObjDerived;
PlaneObjDerived *po2 = new PlaneObjDerived;
queue.Enqueue(po1);
queue.Enqueue(po2);
// queue.Enqueue(10); // ERROR: error C2664: 'QueueObj<T>::Enqueue' : cannot convert parameter 1 from 'int' to 'const PlaneObj &'
po1 = static_cast<PlaneObjDerived *>(queue.Dequeue());
po2 = static_cast<PlaneObjDerived *>(queue.Dequeue());
po1->Print();
po2->Print();
return 0;
}