Выбор разновидности классов для реализации функции во время выполнения? - PullRequest
0 голосов
/ 20 сентября 2010

Я хочу отправить данные и описание возможностей на удаленный сайт. Получив данные на удаленном сайте, я хочу посмотреть описание и создать объект (с помощью фабричного метода), делающий именно то, что я хочу, когда я запускаю для него exec.

Примеры:

1) отправить [3, (добавить 5)] => получить (объект); obj-> exec () -> 8

2) отправить [3, (добавить -1, мульт 2)] => получить (объект); obj-> exec () -> 4

Я думал о том, чтобы иметь классы сумматоров и группировок в какой-либо форме множественного наследования, но не мог ничего понять, поскольку это включает в себя создание множества классов с различными сочетаниями возможностей. Я думаю, что мне нужно что-то узнать :) шаблоны? Моя главная задача - чтобы в функции exec () не было условных нулей, а также легко добавлялись новые возможности.

спасибо

1 Ответ

0 голосов
/ 20 сентября 2010

Вы говорите, что не хотите создавать отдельные классы для разных комбинаций способностей, на что я согласен. Но можете ли вы разделить свои «способности» на набор атомарных операций и другой набор комбинаторов. Если они все происходят из общего объекта executor с виртуальным методом exec, это может помочь:

class executor {
  public:
  virtual double exec();
};

class constant_exec : public executor {
  public:
  constant_exec(double value) : m_value(value) {}
  double exec() {return m_value;}
  private:
  double m_value;
};

class add_op : public executor {
  public:
  add_op(executor const *lhs, executor const* rhs) : m_lhs(lhs), m_rhs(rhs){}
  double exec() {return rhs->exec + lhs->exec;}
  private:
  executor const* m_rhs, m_lhs;
};
  ... and so on

Таким образом, вы можете создавать произвольно сложные операции. Вам нужно беспокоиться о правильной утилизации объектов-исполнителей, поэтому вы можете рассмотреть возможность использования общих (и, возможно, слабых) указателей, хотя это немного повлияет на производительность.

Матф

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...