Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Попробую еще раз, на пальцах :) (+)

Отправлено smb (89.169.79.46) 24 августа 2010, г. 00:55
В ответ на: дык вот в чем мой вопрос [+] отправлено MegaJohn 23 августа 2010, г. 11:35

Когда вы объявляете нестатическую ф-ию-член класса следующим образом:

Class2
{
public:
Class myClass1;
void c2_func( void );
}


То это эквивалентно С-шному объявлению:

typedef struct
{
Class myClass1;
} Class2;
void Class2_c2_func(Class2 *this , /*void*/ );


Т.о, когда вы пытаетесь "подсунуть" ф-ию Class2::c2_func() в ф-ию SetCallBack(), то компилятор справедливо ругается - ведь он ожидает указатель на ф-ию, не принимающую никаких аргуменов, а у c2_func есть аргумент (неявный).

Для того, что бы решить эту проблему, можно объявить ф-ию c2_func() статической:

Class2
{
public:
Class myClass1;
static void c2_func( void );
}


В этом случае вы сможете передать указатель на нее в SetCallBack(), однако внутри c2_func вы не сможете работать с полем myClass1, т.к. указатель this отсутствует.

Поэтому стандартной практикой считается, что ф-ия callback должна получать минимум 1 параметр, который указывает пользователь при регистрации callback-а:


typedef void(*Callback)( void *pUserObject );

class Class1
{
public:
void SetCallback(Callback pCB, void *pUserObject)
{
mCB = pCB;
mpUser = pUserObject;
};

void SomeFuncThatCallsCallback()
{
...
// вызываем callback
mCB(mpUser);
...
}

private:
Callback mCB;
void *mpUser;
}


class Class2
{
public:
Class1 mClass1;
int mA1,mA2;

Class2()
{
// в конструкторе зарегистрируем наш callback
mClass1.SetCallback(myCallback, this); // в качестве pUserObject передаем указатель на наш объект.
}

static void myCallback(void *pUserObject)
{
Class2 *pThis = (Class2 *)pUserObject; //правильнее использовать static_cast

// можно обращаться к полям Class2 вот так:
This->mA1=0;
// или просто вызвать нестатическую ф-ию
This->myCallback_nonstatic();
}

void myCallback_nonstatic()
{
// и в ней уже обращаться как обычно:
mA2=mA1;
}

}


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
отымите от 2 единицу:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru