drem1lin
@drem1lin
чуть программист, чуть чуть админ...

Как передать указатель на метод экземпляра класса, как параметр конструктора?

Добрый вечер, подскажите.
Я написал класс чтения из pipe и заметил, что сообщения дробятся, по этому я решил создать класс буферизатора, который будет накапливать прочтенные данные. Класс, читающий данные из pipe, в своем конструкторе имеет параметр, указывающий, какую функцию надо вызвать, когда приходят данные и туда я хочу передать функцию из класса буферизатора. Напрямую это сделать нельзя, так как функция экземпляра не является static. Я начал читать про путь с использованием подставного callback, но потом наткнулся, что можно использовать std::function и std::bind. Вот это я и попытался сделать, но так и не понял, как довести дело до ума.
В классе, который читает данные из pipe я определил
class NamedPipeClass
{
       	NamedPipeClass(char* _pipeName, bool isClient, std::function<void(unsigned char*, unsigned int)> ReadCallBack)
        {
           ....
          onReadCallback = ReadCallBack;
        };
	std::function<void(unsigned char*, unsigned int)> onReadCallback;
}

И создавая экземпляр класса
MessageCollectorClass* msgCollector = new MessageCollectorClass();
	NamedPipeClass* hltPipe = new NamedPipeClass(myfifo, true, std::bind(&msgCollector::AddData, this, std::placeholders_1));

но это не правильно. Подскажите, как это сделать корректно?
  • Вопрос задан
  • 886 просмотров
Решения вопроса 2
@MarkusD Куратор тега C++
все время мелю чепуху :)
Павел Каптур , а правильно будет - использовать примитивы проектирования. В частности - декоратор или просто интерфейс.

А вот по поводу std::function и std::bind смотри пример - cpp.sh/56bak . У тебя плейсхолдера нехватает.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
#include <functional>

class MessageCollectorClass
{
public:
        void AddData(unsigned char* p, unsigned int i)
        {
                printf("%s: %p, %d\n", __func__, p, i);
        }
};

class NamedPipeClass
{
public:
        NamedPipeClass(const char* _pipeName, bool isClient, std::function<void(unsigned char*, unsigned int)> ReadCallBack)
        {
          onReadCallback = ReadCallBack;
        };
        std::function<void(unsigned char*, unsigned int)> onReadCallback;
        void f()
        {
                onReadCallback((unsigned char *)0x12345678, 10);
        }
};

int main()
{
        MessageCollectorClass* msgCollector = new MessageCollectorClass();
        NamedPipeClass* hltPipe = new NamedPipeClass("myfifo", true, std::bind(std::mem_fn(&MessageCollectorClass::AddData), msgCollector, std::placeholders::_1, std::placeholders::_2));
        hltPipe->f();
        return 0;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы