Шаблон проектирования стратегии C++, создание массива интерфейса

После реализации паттерна стратегии я хотел создать массив типа интерфейса, в который затем можно было бы добавить любой конкретный тип.

Для тех, кто не знает паттерна стратегии: http://en.wikipedia.org/wiki/Strategy_pattern В этом конкретном примере я хотел бы создать массив StrategyInterface, который затем я могу заполнить конкретными типами A, B и C. Однако, поскольку это абстрактный класс, я не могу этого сделать. Есть ли способ сделать это или это совершенно невозможно без удаления абстрактного метода?

Даже если бы вы могли создать массив / вектор интерфейса, вы бы столкнулись с проблемой нарезки объектов. Это еще одна причина использовать указатели.

Martin York 06.10.2008 01:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
3 396
4

Ответы 4

указатели хранилища, а не объекты ..... используйте boost :: shared_ptr, если вы хотите хранить объекты.

Сделайте указатели хранилища массива на тип интерфейса:

typedef std::vector<Interface *> Array;
Array myArray;
myArray.push_back(new A());

Кроме того, вы можете использовать ptr_vector, который управляет памятью за вас:

typedef boost::ptr_vector<Interface> Array;
// the rest is the same

эээ, например ... std :: vector <boost :: shared_ptr <AbstractStrategy>>

Вы можете отредактировать свой собственный исходный ответ - просто нажмите ссылку "изменить"

1800 INFORMATION 05.10.2008 11:06

Как насчет использования Boost?

Вот пример того, как это будет выглядеть

#include <list>
#include <boost/any.hpp>

using boost::any_cast;
typedef std::list<boost::any> many;

void append_int(many & values, int value)
{
   boost::any to_append = value;
   values.push_back(to_append);
}

void append_string(many & values, const std::string & value)
{
   values.push_back(value);
}

void append_char_ptr(many & values, const char * value)
{
   values.push_back(value);
}

void append_any(many & values, const boost::any & value)
{
   values.push_back(value);
}

void append_nothing(many & values)
{
   values.push_back(boost::any());
}

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

Примечание. Эти имена функций информативны, но вы можете использовать переопределение, чтобы иметь единый интерфейс.

Это разумный вариант, но вам следует остановиться подробнее.

1800 INFORMATION 06.10.2008 10:25

Спасибо, 1800. Я, наверное, должен был добавить пример, чтобы прояснить, почему усиление было бы хорошим. Так что теперь я это сделал.

Robert Gould 06.10.2008 11:14

Другие вопросы по теме