и снова доброго вечера всем форумчанам. Возникла проблема с переопределением объектов std::function<void()> и будто вещь это не особо сложная, а разобраться никак не получается. есть у меня некоторый класс:
введите код здесь
#include <functional>
class ProcessEventHandler
{
public:
std::function<void()> ProcessCrashHandler;
std::function<void()> 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<void()> ProcessCrashHandler;
std::function<void()> 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
Не-не, так не пойдёт.
Дело в том, что onProcessCrash
— не функция! Поэтому вы не сможете сохранить её не только в переменной типа std::function<void(void)>
, но даже обыкновенному указателю на функцию типа void (*)(void)
.
На самом деле это функция-член, для её вызова вам нужен конкретный this
. Привязка this
осуществляется просто: при помощи std::bind
.
Попробуйте так:
ProcessCrashHandler = std::bind(&ProcessManager::onProcessCrash, this);
Прошу, подскажите, мне нужно перенести весь текст элемента ListBox в другойЭтот код переносит почему-то только часть текста: