Информация об изменениях

Сообщение Re[8]: Метод класс как С колбек от 10.04.2015 15:54

Изменено 10.04.2015 15:59 beyv

Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, beyv, Вы писали:


B>>Даа, умеет. Задача автора: "Метод класс как С колбек" а не "простой указатель на фукнцию"


EP>Прочитай изначальное сообщение, а не только его заголовок.


Прочитайте исходные код FastDelegate, прежде чем умничать.
Основная загвоздка у ТС получения доступа к полям класса в теле колбека или где там.

Пожалуйста, получите от делегата указатель "This", приведите его к классу и вот вам класс


#include "stdafx.h"
#include "FastDelegate.h"

using namespace fastdelegate;

// Это класс
class CClass {
protected:
    char *m_name;
public:
    CClass(char *name) : m_name(name) {};

    // Это метод класса
    int Function(int num, char *str) {
        printf("In Function in %s. Num=%d, str = %s\n", m_name, num, str); return -1;
    }

};

int _tmain(int argc, _TCHAR* argv[])
{
    typedef FastDelegate2<int, char *, int> FunctionDelegate;
    // Создаете класс
    CClass a("Base A");

    // "deleg" - переменная-колбек, цепляем на неё метод класса
    FunctionDelegate deleg;

    // можем передать его куда угодно
    deleg = MakeDelegate(&a, &CClass::Function);

    // можем использовать как функцию
    deleg(7, "tr");
    
    // Чуть поизвращаясь, можно получить указатель на сам класс
    const detail::ClosurePtr<int, char *, int>& p = (const detail::ClosurePtr<int, char *, int>&)deleg.GetMemento();
    CClass* ap = (CClass*)p.GetClosureThis();

    // Получили класс со всеми потрохами
    ap->Function(77, "ааааа");

    return 0;
}
Re[8]: Метод класс как С колбек
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, beyv, Вы писали:


B>>Даа, умеет. Задача автора: "Метод класс как С колбек" а не "простой указатель на фукнцию"


EP>Прочитай изначальное сообщение, а не только его заголовок.


Прочитайте исходные код FastDelegate, прежде чем умничать.
Основная загвоздка у ТС получения доступа к полям класса в теле колбека или где там.

Пожалуйста, получите от делегата указатель "This", приведите его к классу и вот вам класс


#include "stdafx.h"
#include "FastDelegate.h"

using namespace fastdelegate;

// Это класс
class CClass {
protected:
    char *m_name;
public:
    CClass(char *name) : m_name(name) {};

    // Это метод класса
    int Function(int num, char *str) {
        printf("In Function in %s. Num=%d, str = %s\n", m_name, num, str); return -1;
    }

};

int _tmain(int argc, _TCHAR* argv[])
{
    typedef FastDelegate2<int, char *, int> FunctionDelegate;
    // Создаете класс
    CClass a("Base A");

    // "deleg" - переменная-колбек
    FunctionDelegate deleg;

    // цепляем на неё метод класса и можем передать его куда угодно
    deleg = MakeDelegate(&a, &CClass::Function);

    // можем использовать как функцию
    deleg(7, "tr");
    
    // Чуть поизвращаясь, можно получить указатель на сам класс
    const detail::ClosurePtr<int, char *, int>& p = (const detail::ClosurePtr<int, char *, int>&)deleg.GetMemento();
    CClass* ap = (CClass*)p.GetClosureThis();

    // Получили класс со всеми потрохами
    ap->Function(77, "ааааа");

    return 0;
}