Ограничить аргумент конкретным классом и производным классом в переполнении стека

Я работаю над проектом по преобразованию некоторого кода из языка моделирования MODSIM в C ++ и наткнулся на то, что мне трудно понять.

Пример кода:

PlaneQueueObj = OBJECT(QueueObj[ANYOBJ:PlaneObj])

Это означает, что мы объявляем class PlaneQueueObj который наследуется от QueueObj, который позволяет только объекты class PlaneObj или классы, полученные из PlaneObj в очередь. (Классы называются объектами на этом языке …)

Я хочу знать, как это можно реализовать в C++,
Это может быть действительно очевидно, и я просто запутался, но я новичок здесь, так что успокойся.

0

Решение

Я думаю, что вы просто ищете, 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());
3

Другие решения

Будет ли что-то подобное сделать это?

Я полагаю, что ваша очередь делает что-то особенное, поэтому вам нужно реализовать ее самостоятельно.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я никогда не писал шаблоны, поэтому я могу быть совершенно неправ;)

#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;
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector