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





указатели хранилища, а не объекты ..... используйте 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>>
Вы можете отредактировать свой собственный исходный ответ - просто нажмите ссылку "изменить"
Как насчет использования 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. Я, наверное, должен был добавить пример, чтобы прояснить, почему усиление было бы хорошим. Так что теперь я это сделал.
Даже если бы вы могли создать массив / вектор интерфейса, вы бы столкнулись с проблемой нарезки объектов. Это еще одна причина использовать указатели.