Основная идея, которую я пытаюсь реализовать, - это метод вызова класса A из класса B и наоборот. Вот мой код:Коммуникация 2 пути между классами в C++
main.cpp
void AppCB (uint8_t num, TempB* inst){
printf("Application Level Callback Called!!!\n");
}
void main(int, char*[]) {
printf("Starting Up!!!\n");
TempB instB(1, funcptr_arg1 (&AppCB));
instB.funcB();
}
callback.cpp
void TempA :: tempa_cb (void){
printf("Calling Callback to B\n");
tempBobj->funcB_cb();
}
void TempA :: funcA(){
// some delay
tempa_cb();
}
void TempA :: registerTempB (TempB *tempbobj){
this->tempBobj = tempbobj;
}
TempB :: TempB (uint8_t num , funcptr_arg1 AppCallback){
printf("Constructor TempB\n");
slot = num;
funtptrB = AppCallback;
instA.registerTempB(this);
}
void TempB :: funcB(){
instA.funcA();
}
void TempB :: funcB_cb(){
printf ("Call from TempA\n");
this->funtptrB(event, this); // <<<<<<<<<<<< this pointer is corrupted here. Hence it is not able to call the AppCB function in main.cpp file.
}
callback.h
typedef void (*funcptr_arg1)(int, void *);
class TempB;
class TempA {
private:
uint8_t tempa;
TempB *tempBobj;
public:
void funcA();
void tempa_cb(void);
void registerTempB (TempB *tempbobj);
};
class TempB {
private:
uint8_t slot;
funcptr_arg1 funtptrB;
TempA instA;
public:
TempB (uint8_t num, funcptr_arg1 funtptrB);
void funcB();
// this function should be called from object of A.
void funcB_cb();
};
Из приведенного выше кода, я хотел бы знать:
- Почему «это» указатель (он используется для вызова функции) поврежденным, как отмечено в коде?
- Есть ли лучшее для этого?
Cheers, Vineet.
Вы никогда не должны использовать C-указатели функций в программе на C++, если вам не нужно связываться с устаревшим кодом C, который требует этого. Эти экземпляры классов должны связываться друг с другом через указатели классов. – pasztorpisti
Были бы проблемы с глубинными функциями. Я впервые слышу об этом. – xvan
Спасибо за информацию. Я новичок в C++. Поэтому, исследуя наилучший вариант :-) – Jain