Когда вы объявляете нестатическую ф-ию-член класса следующим образом:
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;
}
}