powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на функцию
9 сообщений из 9, страница 1 из 1
указатель на функцию
    #34323109
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно передать в качестве параметра одному из методов класс указатель на метод другого класса. Подскажите, пожалуйста, как это сделать. Почему следующий пример не работает?
typedef void (*PF) ();

class A
{
public:
void f();
};

class B
{
public:
void f1(PF p)
{
}
void f2()
{
}
};

void main()
{
A a;
B b;
b.f1(&a.f());

}
...
Рейтинг: 0 / 0
указатель на функцию
    #34323139
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то типа такого

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
class A
{
public:
void f();
};

typedef void (*A::Afunc) ();

class B
{
public:
void f1(A *a, Afunc f)
{
(*a).f();
}
void f2()
{
}
};

void main()
{
A a;
B b;
b.f1(&a, &a::f());

}
...
Рейтинг: 0 / 0
указатель на функцию
    #34323929
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой способ не очень подходит в данном случае. Попробую переформулировать вопрос.

Есть некоторый класс, который может обнаружить некоторое событие (например, приём данных).
typedef void (READ_EVENT) (char);

class Communication
{
public:
void StartService()
private:
READ_EVENT _readEvent;
};
Есть другой класс, который должен обрабатывать это событие.
class DataProcessing
{
public:
void ReadDataEvent(char byte);//Обработчик передачи данных события
private:
Communication *_pCommunication;
}
Вопрос заключается в том, как указатели из класса Communication передать адрес метода
ReadDataEvent.
...
Рейтинг: 0 / 0
указатель на функцию
    #34324199
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
#ifndef __IDELEGATE__DELEGATE_H__
#define __IDELEGATE__DELEGATE_H__

//Интерфейс делегата
class IDelegate {
    public:
        virtual void operator() (void *sender, void *senderArgs)= 0 ;
};

//Делегат
template <typename TClass>
class Delegate : public IDelegate {
    private:
        typedef void (TClass::*TMethod) (void *predefinedArgs, void *sender, void *senderArgs);
        TClass *target;
        TMethod method;
        void *predefinedArgs;

    public:
        Delegate(TClass *ptarget, TMethod pmethod, void *ppredefinedArgs) :
                    target(ptarget), method(pmethod), predefinedArgs(ppredefinedArgs) {};
        virtual void operator() (void *sender, void *senderArgs) {
            (target->*method)(predefinedArgs, sender, senderArgs);
        };
};

#endif

...
Рейтинг: 0 / 0
указатель на функцию
    #34324302
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть в моём случае проще использовать паттерн Observer?
...
Рейтинг: 0 / 0
указатель на функцию
    #34324322
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Может быть в моём случае проще использовать паттерн Observer?

Может. Не знаком.
...
Рейтинг: 0 / 0
указатель на функцию
    #34324373
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже приведённый пример тоже решает мою задачу. Только мне он кажется достаточно сложным. Мне кажется, что в моём примере проще всего использовать паттер Observer. Класс, который должен сообщить о событии, будет хранить список объектов Observer, с достаточно простым интерфейсом. Что-то вроде:
class Communication
{
public:
Attache(Observer o);
Detache(Observer);
void NotifyAboutReadByte(char byte)
{
//Для всех объектов Observer
o->ReadByteEvent(byte);
}
};

class Observer
{
virtual void ReadByteEvent(char byte) {}
};

Класс, которые будет обрабатывать события класса Communication будет переопределять методв класса Observer.


Нельзя ли привести пример реализованного таким образом делегата? Заранее спасибо.
...
Рейтинг: 0 / 0
указатель на функцию
    #34324400
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по-видимому, делегат тебе не нужен. Делегат – более мощное средство обработки событий, он позволяет вызывать не только предопределённый метод (void Observer::ReadByteEvent(char)), а любой метод с такой же сигнатурой. Обычный интерфейс и полегче и попонятнее.
...
Рейтинг: 0 / 0
указатель на функцию
    #34324426
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на функцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]