Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Проблема с переопределением std::function

#winapi #cpp11 #cpp


и снова доброго вечера всем форумчанам.
Возникла проблема с переопределением объектов std::function
и будто вещь это не особо сложная, а разобраться никак не получается.
есть у меня некоторый класс:
введите код здесь
#include 
class ProcessEventHandler
{
public: 
      std::function ProcessCrashHandler;
      std::function ProcessStopHandler;
};

с его помощью я буду реализовывать Колбек в следующий класс
class ProcessManager : public ProcessEventHandler
{
public:
ProcessManager(const std::string &sFilePath);
ProcessManager(const _int32 &ProcessID);
~ProcessManager();
............
private:
 void onProcessStart();
 void onProcessWatch();
 void onProcessCrash();
 void onProcessStopped();
 void onProcessManulyStop();
...........
};

проблема заключается в том, что для объектов
   std::function ProcessCrashHandler;
   std::function ProcessStopHandler;

в классе потомке нужно присвоить функции
void onProcessCrash();
void onProcessStopped();

пытаюсь это сделать в конструкторе
  ProcessManager::ProcessManager(const std::string &sFilePath) :
  m_ppiProcInfo(),
  m_sCommandLine(sFilePath),
  m_isRunning(false)
  {
  ProcessCrashHandler = onProcessCrash;  
  ProcessStopHandler = &ProcessManager::onProcessStopped;

  m_pcEventLoger = new EventLogger(getCurrentDirPath());
  onProcessStart();
   }

я как только уже не пробовал ничего не получается, через лямда пробовал тоже не получилось.
не могу понять то ли у меня руки кривые, или с компилятором-то не в порядке
Помогите пожалуйста
ошибки
 error C2679: binary '=' : no operator found which takes a right-hand operand of
type 'overloaded-function' (or there is no acceptable conversion)  
 error C3867: 'ProcessManager::onProcessCrash': function call missing argument list;
use '&ProcessManager::onProcessCrash' to create a pointer to member
    


Ответы

Ответ 1



Не-не, так не пойдёт. Дело в том, что onProcessCrash — не функция! Поэтому вы не сможете сохранить её не только в переменной типа std::function, но даже обыкновенному указателю на функцию типа void (*)(void). На самом деле это функция-член, для её вызова вам нужен конкретный this. Привязка this осуществляется просто: при помощи std::bind. Попробуйте так: ProcessCrashHandler = std::bind(&ProcessManager::onProcessCrash, this);

Комментариев нет:

Отправить комментарий