Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Не работают функторы, сохраняют старое значение


Автор: ller 12.6.2009, 12:33
Код

template<class T> class MAX
{
    T maxt;
public:
    MAX():maxt(numeric_limits<T>::min()){}
    void operator ()(T x)
    {
        maxt = max(x,maxt);
    }
    T result()const{return maxt;}
};

template<class T> class SUM
{
    T res;
public:
    SUM(T i =0):res(i){}
    void operator()(T x){res+=x;}
    T result()const{return res;}
};

int main()
{
    vector<int> vi;
    MAX<int> *maxi=new MAX<int>;
    SUM<int> summ;
    //MAX<int> &tempm = *maxi;

 // заполнение vi ------
   
    for_each(vi.begin(),vi.end(),*maxi);
    for_each(vi.begin(),vi.end(),summ);
    cout << "\n--------------\n" << maxi->result() <<" сумма " << summ.result()<<endl; // prints[U][/U]
}



Вот простенькая програмка с использованием функторов. vi заполнен числами. В дебагере при работе for_each внутренние переменные класссов меняются как положенно, но при выводе пишут минимальный int и 0 соответственно.

Автор: azesmcar 12.6.2009, 15:19
ller

for_each функтор по значению принимает, все что он изменяет, изменяется в локальной копии, а ваша остается неизменной. Но есть и хорошая новость, она возвращает свою локальную копию.
Код

MAX<int> max = for_each(vi.begin(),vi.end(), MAX<int>());
cout << max.result() <<endl;


Автор: mes 12.6.2009, 15:31
я понимаю, что приведенные в примере функторы, лишь экспериментальные, но на всякий случай скажу что есть :
std::max_element : http://www.cplusplus.com/reference/algorithm/max_element/
std::min_element : http://www.cplusplus.com/reference/algorithm/min_element/
std::accumulate   : http://www.cplusplus.com/reference/std/numeric/accumulate/
 smile 

Автор: ller 12.6.2009, 15:37
azesmcar
Что то подобное я предполагал, поэтому создал указатель и инициализировал его...

Спасибо за ответ smile

Добавлено @ 15:42
mes
Про max и min элемет спасибо, не встретил их в книге, accumulate знал. Я просто учусь и пробую smile

Автор: ller 15.6.2009, 01:22
все

Автор: andrew_121 15.6.2009, 01:34
)) Три дня думал...

Автор: ller 15.6.2009, 13:57
Так не знал, что метить надо ))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)