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

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

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

Ответы [ 4 ]

6 голосов
/ 05 октября 2008

Заставить массив хранить указатели на тип интерфейса:

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
2 голосов
/ 05 октября 2008

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

1 голос
/ 05 октября 2008

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

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

#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());
}

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

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

1 голос
/ 05 октября 2008

ошибка, например ... std :: vector >

...