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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> переопределение функции 
V
    Опции темы
mes
Дата 26.11.2010, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Cheloveck @  26.11.2010,  09:18 Найти цитируемый пост)
как мой последний, только требует глобальной переменной.

Цитата(Cheloveck @  26.11.2010,  10:00 Найти цитируемый пост)
Это либо то, что ТС хочет избежать, либо глобальная переменная, либо дополнительный параметр. 


последний пример, это этот ? :
Код

#include <iostream>
class CProcess
{
    typedef int (CProcess::*FooType)(int x);
public:
    CProcess(int var)
    {
        switch(var)
        {
        case 1:
            m_function = &CProcess::Foo1;
            break;
        case 2:
            m_function = &CProcess::Foo2;
            break;
        default:
            m_function = &CProcess::Stub;
            break;
        }
    }
    int Run(int x)
    {
        return (this->*m_function)(x);
    }
private:
    int Foo1(int x)
    {
        return 2 * x * x + 5;
    }
    int Foo2(int x)
    {
        return 4 * x + 1;
    }
    int Stub(int)
    {
        return 0;
    }
private:
    FooType m_function;
};
void MegaFunction(int var)
{
    CProcess process(var);
    for(int i = 0; i < 5; ++i)
    {
        std::cout << process.Run(i + 100) << " ";
    }
    std::cout << std::endl;
}
int main()
{
    MegaFunction(1);
    MegaFunction(2);
    return 0;
}

не могли бы вы уточнить где преимущества и зачем столько лишнего ?


Это сообщение отредактировал(а) mes - 26.11.2010, 11:25


--------------------
PM MAIL WWW   Вверх
mes
Дата 26.11.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



ладно не буду ждать ответа.. взял за основу вашу мегафункцию - сравнивайте :
Код

void MegaFunction(int var)
{
   struct L
   {
      static int f1(int x) { return 2 * x * x + 5;  }
      static int f2(int x) { return 4 * x + 1;      }
   };
   
   int (&fn)(int x) = var? L::f1 : L::f2;
   
   for(int i = 0; i < 5; ++i)
   {
        std::cout << fn(i + 100) << " ";
   }
   std::cout << std::endl;
}





--------------------
PM MAIL WWW   Вверх
Cheloveck
Дата 26.11.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



mes, если будет 50 подобных функций, вам нужно будет 50 раз писать
Код

   struct L
   {
      static int f1(int x) { return 2 * x * x + 5;  }
      static int f2(int x) { return 4 * x + 1;      }
   };
   
   int (&fn)(int x) = var? L::f1 : L::f2;

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


--------------------
user posted image
PM Jabber   Вверх
mes
Дата 26.11.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Cheloveck @  26.11.2010,  10:46 Найти цитируемый пост)
 а объект класса можно создать где угодно, и

для получения объекта нужен все равно параметр.. для получения функции он же..

Цитата(Cheloveck @  26.11.2010,  10:46 Найти цитируемый пост)
 если будет 50 подобных функций, вам нужно будет 50 раз писать

достаточно вынести из функции :
Код

namespace A {

typedef int (*fn_t)(int x);
int f1(int x) { return 2 * x * x + 5;  }
int f2(int x) { return 4 * x + 1;      }

fn_t get_fn(int var) { return var? f1 : f2; }

};

void MegaFunction(int var)
{
   A::fn_t fn = A::get_fn(var);
      
   for(int i = 0; i < 5; ++i)
   {
        std::cout << fn(i + 100) << " ";
   }
   std::cout << std::endl;
}



--------------------
PM MAIL WWW   Вверх
Cheloveck
Дата 26.11.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(mes @  26.11.2010,  11:54 Найти цитируемый пост)
достаточно вынести из функции 

И, теперь, если придать этому законченный вид, получится мой пример.


--------------------
user posted image
PM Jabber   Вверх
mes
Дата 26.11.2010, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



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

Добавлено через 8 минут и 58 секунд
Цитата(Cheloveck @  26.11.2010,  10:56 Найти цитируемый пост)
И, теперь, если придать этому законченный вид, получится мой пример. 

не совсем :
Код

struct F
{
   F(int var) : fn (var ? F::f1 : F::f2 ) {}
 
   int operator() (int x) { return fn(x); }
 
 protected:
   static int f1(int x) { return 2 * x * x + 5;  }
   static int f2(int x) { return 4 * x + 1;      }
 private:
   int (&fn)(int);    
};

void MegaFunction(int var)
{
   F fn(1);
      
   for(int i = 0; i < 5; ++i)
   {
        std::cout << fn(i + 100) << " ";
   }
   std::cout << std::endl;
}


Добавлено через 10 минут и 30 секунд
но вопрос был не в схожести, а в том что
Цитата(Cheloveck @  26.11.2010,  09:18 Найти цитируемый пост)
 только требует глобальной переменной

 smile 


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 26.11.2010, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(gordmiand @  25.11.2010,  21:31 Найти цитируемый пост)
будет конечно же ошибка, так как условие для  #if должно быть константным (const)
В корне неверно. Препроцессор не работает с константами. Он выполняет макроподстановки - копипаст. Можно "задефайнить" макрос (#define MACRO_NAME), и проверять что он  "задефайнен" "#ifdef  MACRO_NAME" и т.д. . Но всё это выполняет препроцессор. Когда препроцессор закончит, в коде не останется ни одного макроса. Ради интереса, поищи флаг компилятора, который выдаёт код после обработки препроцессором.
const - обрабатывается не препроцессором, а компилятором. Этот модификатор призван защитить переменную от изменений.
Цитата(gordmiand @  25.11.2010,  21:31 Найти цитируемый пост)
 но у меня-то это значение (parametr) считывается из файла в начале программы
Эта работа, которая никакого отношения к препроцессору иметь не может. Считываться из файла может только в рантайме (когда программа исполняется CPU). Значит и обрабатывать надо в рантайме. Т.е. после того как "вычислил" значение переменной в соответсвии с ним, что-то сделать, например, настроить глобальный указатель на нужную функцию. Которая потом всегда будет вызываться через него. А функцию, спрятать в другом cpp файле (единице трансляции), если чистый С, то с модификатором static, что-бы её нельзя было вызвать напрямую (в С++ для этих целей есть безымянные пространства имён - unnamed namespaces).

Что такое компилятор или Этапы сборки программы...
Ответы на часто задаваемые вопросы!

Это сообщение отредактировал(а) Леопольд - 26.11.2010, 14:52


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Cheloveck
Дата 26.11.2010, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Леопольд @  26.11.2010,  14:43 Найти цитируемый пост)
Ради интереса, поищи флаг компилятора, который выдаёт код после обработки препроцессором.

http://forum.vingrad.ru/index.php?showtopi...t&p=2254657


--------------------
user posted image
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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