Как извлечь из дэка без литья?

У меня есть 5 классов, которые называются операторами:

 * Enter(x)
* Exit(x)
* Push(b,x,y)
* TurnOn(x)
* TurnOff(x)

И еще 3 класса, которые называются предикатами:

 * At(x,y) - example : At(Robot,Room3) , At(Box1,Room1) , At(Box3,Corridor)
* SwithOn(x) - SwitchOn(Room2)
* SwitchOff(x) - SwitchOff(Room1) , SwitchOff(Room4)

И я хочу иметь хорошую структуру данных, хранить их.

Сначала я создал два базовых класса и использовал наследование:

  • Учебный класс Predicate за At(x,y) , SwithOn(x) а также SwitchOff(x)

  • Учебный класс Operator за Enter(x) , Exit(x) , Push(b,x,y) , TurnOn(x) , TurnOff(x) ,

И я добавил два запроса:

std::deque<Operator> operators;
std::deque<Predicate> predicates;

А потом, когда я создаю, например, Exit оператор:

Exit myExit ;

и толкнуть его в деку:

operators.push_back(myExit); // this works fine

Но я, когда я пытаюсь извлечь какой-то элемент из operators Дык, я бы использовал какое-то кастинг.

  1. Можно ли иметь структуру данных, которая может хранить несколько (Различные типы) объекты ?

  2. Я все еще на стадии планирования, можете ли вы предложить какой-то другой вид дизайна, чтобы у меня не было проблем с извлечением элементов? лучшее, что я могу придумать, это полиморфизм …

С уважением

1

Решение

Для ваших конкретных требований я бы посмотрел на то, как сделать Оператор полиморфным и сохранить данные в контейнерах повышающего указателя, таких как ptr_vector. В конце концов, имеет смысл, что все различные конкретные операции имеют общее, что они являются операторами.

Ваша текущая реализация с базовым std :: deque<> приведет к нарезке объектов, поскольку вы храните только базовый класс, так что это не сработает. В этом конкретном случае, когда желателен полиморфизм, вам действительно нужно хранить указатель на объект. В вашем случае вы, вероятно, хотите использовать

boost::ptr_vector<Operator> something;

Если вы не можете использовать boost, другой вариант — использовать стандартный контейнер с чем-то вроде std :: shared_ptr, например, так:

std::deque<std::shared_ptr<Operator> > something;

Вы не хотите хранить необработанные указатели в std :: vector, поскольку это приводит к всевозможным интересным проблемам управления временем жизни, которых легко избежать.

2

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

Можно ли иметь структуру данных, которая может хранить несколько
объекты ?

Да, это называется Состав. Если вы хотите хранить только один тип за раз, вы используете union создать Вариант. Ни то, ни другое не может быть хорошей идеей для того, что вы описали.

Я все еще на стадии планирования, можете ли вы предложить, возможно, некоторые
другой вид дизайна, поэтому у меня не будет проблем с извлечением элементов
? лучшее, что я могу придумать, это полиморфизм …

Для меня это звучит так, как будто тебе нужен полиморфизм. Вы не можете просто использовать приведение, чтобы превратить один тип в другой из базового типа. Ну, вы можете, но вы потеряете данные. Сейчас у вас есть эффективное приведение ваших подклассов к их базовому классу, а затем копирование по значению в deque,

Чтобы воспользоваться полиморфизмом, просто храните указатели (Opererator* или же Predicate*) в деке (или использовать std::auto_ptr).

1

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