2010-09-20 1 views
0

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

Примеры:

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

2) отправить [3, (добавить -1, mult 2)] => принять (obj); obj-> exec() -> 4

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

благодарит

+0

В чем причина наличия нулевых условных условий в exec()? – Simon

+0

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

+0

Приказ не важен, хотя – perreal

ответ

0

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

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 

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

-matt

+0

Спасибо за ваше время. Это будет дерево разбора в конце? Я не вижу, как я могу комбинировать разные операции таким образом. – perreal

+0

Ну, это, по крайней мере, дерево оценки. Во втором примере выше построенный объект будет выглядеть так: new mul_op(new const_exec(2), new add_op(new const_exec(-1), new const_exec(3))). Если ваши сообщения просто цепочки multiply/add, это должно быть легко построить. – Gretchen