Обратные вызовы в C++ | страница 95




Рассмотрим теперь поиск максимального и минимального значения для заданного диапазона номеров датчиков. Вначале разработаем вспомогательный класс, который будет последовательно принимать на вход показания датчиков и искать среди них максимальное и минимальное значение (Листинг 100).

Листинг 100. Класс для анализа минимального и максимального значения (SensorControl.cpp)

>class FindMinMaxValue

>{

>public:

>  enum MinMaxSign { MIN_VALUE = 0, MAX_VALUE = 1 };  // (1)


>  FindMinMaxValue(SensorNumber first, SensorNumber last, MinMaxSign sign) :  // (2)

>    sign_(sign), first_(first), last_(last), count_(0)

>  {

>    if (sign == MIN_VALUE)

>    {

>      result_ = std::numeric_limits::max();  // (3)

>    }

>    else

>    {

>      result_ = std::numeric_limits::min();  // (4)

>    }


>    arrayFunMinMax_[MIN_VALUE] = &FindMinMaxValue::CompareMin;  // (5)

>    arrayFunMinMax_[MAX_VALUE] = &FindMinMaxValue::CompareMax;  // (6)

>  }


>  void operator()(SensorNumber number, SensorPointer sensor)                  // (7)

>  {

>    if ( sensor->isOperable() && (number >= first_ && number <= last_) )  // (8)

>    {

>        (this->*arrayFunMinMax_[sign_])(sensor->getValue());              // (9)

>        count_++;                                                         // (10)

>    }

>  }

>  SensorValue result() { return result_; }  // (11)

>  size_t count() { return count_; }         // (12)

>private:

>  SensorNumber first; // (13)

>  SensorNumber last;  // (14)

>  MinMaxSign sign;    // (15)

>  SensorValue result; // (16)

>  size_t count;       // (17)


>  using FunMinMax = void (FindMinMaxValue::*)(SensorValue value);  // (18)


>  void CompareMin(SensorValue value)  // (19)

>  {

>      if (result_ > value)

>      {

>          result_ = value;

>      }

>  }


>  void CompareMax(SensorValue value)  // (20)

>  {

>    if (result_ < value)

>    {

>      result_ = value;

>    }

>  }


>  FunMinMax arrayFunMinMax_[2];       // (21)

>};


В строке 2 объявлен конструктор, который принимает на вход следующие параметры: минимальное значение диапазона номеров; максимальное значение диапазона номеров; параметр, указывающий, что необходим поиск минимального либо максимального значения. В конструкторе инициализируются переменные класса: минимальное значение диапазона (объявлено в строке 13); максимальное значение диапазона (объявлено в 14); параметр для поиска (объявлено в 15); итоговый результат (объявлено в 16); количество датчиков, которые участвовали в поиске (объявлено в 17). В зависимости от переданного параметра начальный результат инициализируется соответственно максимальным либо минимальным значением (строки 3 и 4). Кроме того, инициализируется массив указателей на функцию (строки 5 и 6, объявление в 21). Данные функции предназначены для сравнения и запоминания максимального либо минимального значений (объявлены в 19 и 20).