Прежде всего, позвольте мне представить немного моей структуры классов. Я проектирую небольшую библиотеку для устройства ARM (STM32), и я хочу реализовать пару объектов, определяющих различные периферийные устройства, доступные в системе.Выполнение метода из другого объекта в C++
class xGPIO : public Peripheral
{
public:
xGPIO();
xGPIO(GPIO_TypeDef * GPIOx1, uint16_t Pinx1);
virtual ~xGPIO();
void on(void);
void off(void);
private:
void xInitGPIO(void);
};
Идея, которую я имею в виду, чтобы реализовать внутреннюю общественную функцию с именем обратного вызова, которая устанавливает, какая функция является следующий называться на моем объекте таймера. Однако эта функция наверняка будет методом, определенным в другом классе, и я хочу, чтобы он выполнялся из xTimer. Поведение здесь должно состоять в том, что всякий раз, когда таймер заканчивает обратный отсчет, он должен вызывать функцию, сохраненную программистом в методе callBack.
class xTimer : public Peripheral
{
public:
xTimer(TIM_TypeDef * tim);
virtual ~xTimer();
/* void callBack(void (*f)()); */
private:
void xInitTimer(void);
TIM_HandleTypeDef htim;
};
void xTimer::callBack(void (*f)())
{
f();
}
Код под main.cpp woudl быть следующим:
int main(void)
{
mySYS->initialize(false);
xGPIO myGreenLed (GPIOB, GPIO_PIN_0);
/* Declare Timers. */
xTimer myTimer(TIM2);
// myTimer.callBack(myGreenLed.on);
}
Любые подсказки о том, как решить эту проблему? Есть ли простой способ выполнить этот проект в программе на C++?
Это почти, но не на 100% понятное, что вы хотите сделать. Если таймер должен вызывать ранее установленный обратный вызов, то почему 'void xTimer :: callBack (void (* f)())' принимает функцию как параметр? Разве таймер не должен знать, какую функцию вызывать заранее? – user463035818
Вам нужен один таймер для обработки всех обратных вызовов или может быть разными таймерами для каждого обратного вызова? – user463035818
Название довольно вводит в заблуждение.Вы не хотите вызывать метод другого _class_, вы хотите вызвать метод другого _object_, здесь 'myGreenLed'. Это критически важно: если 'xGPIO :: on' был методом класса' static' (т. Е. Не нуждался в объекте), вы могли бы преобразовать '& xGPIO :: on' в' void (*)() '. – MSalters