Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вариация методов 
:(
    Опции темы
Nikys
Дата 5.1.2014, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.5.2013

Репутация: нет
Всего: нет



Подскажите, пожалуйста, наиболее удобную схему для вариации методов. Грубо говоря, есть реализация умножения чисел различными методами. Каким образом хранить возможность изменения метода умножения?
На данный момент есть две идеи:
1) Хранение в классе методов в виде функций, на один из которых будет ссылаться указатель на функцию.
2) Хранение в классе объекта абстрактного класса, наследники которого конкретно реализовывают задачу, и к которым динамически приводится тип объекта абстрактного класса (и из него используются возможности этих наследников).

Но хотелось бы услышать более рациональные и грамотные идеи по этому поводу для начинающего. Заранее всем благодарен.
PM MAIL   Вверх
tzirechnoy
Дата 5.1.2014, 22:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



В первую очередь, проанализируйте, когда вам потребуется изменять этот метод умножэния. Если при компиляцыи программы -- то это одно, если при создании объектов/матриц, которые будут умножаться -- то это другое, если при каждом умножэнии,  в зависимости от алгоритма -- третье, если при каждом умножэнии, в зависимости от какой-то настройки глобальной -- четвёртое.
 От этого зависит список доступных методов полиморфизма: абстрагирование при компиляцыи (шаблоны, препроцэссор), абстрагирование через конкретный тип или переменную класса, который содержыт данные, абстрагирование чере конкретный тип или переменную класса, который содержыт конкретные математические формулы, и т.п.
PM MAIL   Вверх
akizelokro
Дата 7.1.2014, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Герб Саттер. Новые сложные задачи для С++.
Hurb Sutter. Exceptional C++ (или More Exceptioanl C++)

глава "Почему невозможна частичная перегрузка шаблонов функций". Лучше не напишешь и не объяснишь, после этого можешь рассуждать (там чёткая база)


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Lukkoye
Дата 7.1.2014, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: 1
Всего: 1



Цитата(Nikys @  5.1.2014,  22:04 Найти цитируемый пост)
Подскажите, пожалуйста, наиболее удобную схему для вариации методов. Грубо говоря, есть реализация умножения чисел различными методами. Каким образом хранить возможность изменения метода умножения?


Вообще то это зависит от конкретной задачи.
Ваш запрос какой то слишком уж не конкретный.

Я приведу пример, как можно на лету менять логику обработок чего-либо:

http://rextester.com/TYPUJ89816

Код

//Title of this code
#include <stdexcept>
#include <functional>
#include <iostream>
using namespace std;


struct Processor
{
    //делегат может нацелится на любую функцию или функтор
    //который возвращает тип int, а в качестве аргументов принимает два const int
    typedef function<int(const int,const int)> Handler;
    
    Handler handler;
    
    Processor()
        :a(10)
        ,b(10)
    {}
    
    int Work()const
    {
        if(!handler)
            throw std::logic_error("invalid handle");

                //запуск удаленной функции        
        return handler(a,b);  
    }
private:
    
    int a,b;
};

int Add(const int v1, const int v2){ return v1+v2; }


struct Tester
{
    int Subtract(const int v1, const int v2)const{ return v1-v2; }
};

struct Functor
{
    int operator()(const int v1, const int v2)const{ return v1-v2; }
};


int main()
{
    cout << "Hello, world!\n";
    
    Processor proc;
    
    //назначаем в качестве обработчика простую функцию
    proc.handler = &Add;
    cout << "operation add: "<<proc.Work()<<'\n';
    
    //назначаем в качестве обработчика функтор
    proc.handler = Functor();
    cout << "operation subtract: "<<proc.Work()<<'\n';
    
    //назначаем в качестве обработчика метод класса
    Tester tester;
    proc.handler = bind(&Tester::Subtract, &tester, std::placeholders::_1,std::placeholders::_2);
    cout << "operation subtract: "<<proc.Work()<<'\n';
    
    //назначаем в качестве обработчика лямбду
    proc.handler = [](const int v1, const int v2){ return v1*v2; };
    cout << "operation multiply: "<<proc.Work()<<'\n';
}



Применяя данный способ, вы сможете на лету (в момент выполнения программы) изменять способ умножения.
Для этого вам понадобится написать несколько функций, каждая реализует какой то один способ.

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


Это сообщение отредактировал(а) Lukkoye - 7.1.2014, 23:34
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0881 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.