Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lect13

.pdf
Скачиваний:
6
Добавлен:
06.02.2016
Размер:
1.67 Mб
Скачать

Примерфунктора

#include <iostream>

class AddValue

{

public:

AddValue(int value):m_value(value) {} void operator()(int & arg)const {

arg += m_value;

}

private:

int m_value;

};

61

Примерфунктора

int main(int argc, char* argv[]) { int value = 10;

AddValue f(5);

std::cout << "Значение до вызова: " << value << std::endl;

f(value);

std::cout<< "Значение после вызова: " << value << std::endl;

return 0;

}

Значение до вызова: 15 Значение после вызова: 10

62

Использованиесостояния функтора

Функтор,вотличиеотфункции, обладаетсостоянием

Глобальныеистатическиепеременные функцийврасчетнеберем

Состояниефунктора,какиобычного объекта,определяетсязначениемполейданных

Вызовфункторавразныхсостояниях можетприводитькразным результатам

63

Примеризменениясостояния функтора

#include <iostream> class AddValue { public:

AddValue(int value, int delta = 0)

 

:m_value(value) ,m_delta(delta) {

 

}

 

// оператор объявлен как неконстантный!

 

void operator()(int & arg) {

 

arg += m_value;

 

m_value += m_delta;

 

}

 

private:

 

int m_value, m_delta;

 

};

64

Примериспользованияфунктора

сизменяющимсясостоянием

class RandomGenerator { public:

RandomGenerator(unsigned modulus, unsigned seed = 0,

unsigned multiplier = 733, unsigned summand = 1559)

:m_modulus(modulus) ,m_seed(seed) ,m_multiplier(multiplier) ,m_summand(summand)

{

}

65

Примериспользованияфунктора

сизменяющимсясостоянием

void Reset(unsigned newSeed) { m_seed = newSeed;

}

unsigned operator()() {

m_seed = m_seed * m_multiplier + m_summand; return m_seed % m_modulus;

}

private:

unsigned m_modulus; unsigned m_seed; unsigned m_multiplier; unsigned m_summand;

};

66

Примериспользованияфунктора сизменяющимсясостоянием

#include <iostream>

int main(int argc, char* argv[]) { RandomGenerator rnd(10);

for (int i = 0; i < 10; ++i) { std::cout << rnd() << ", ";

}

return 0;

}

Вывод:

9, 6, 7, 2, 1, 6, 7, 8, 3, 8,

67

Спасибозавнимание!

68

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]