Указатели функций обратного вызова C ++ с / без классов

Я застрял. Я пытаюсь создать функцию, которая будет есть указатели бесклассовых функций и указатели из объектов. Вот мой текущий код, который, надеюсь, объясняет больше.

] (Он должен работать на Arduino, поэтому я не могу использовать большие библиотеки.)

Во-первых, я использую эту библиотеку для Arduino:

/* SimpleTimer - A timer library for Arduino.
 * Author: mromani@ottotecnica.com
 * Copyright (c) 2010 OTTOTECNICA Italy
 */

Которая выполняет функции, которые она вызывает с заданным интервалом таймера этого типа:

typedef void (*timer_callback)(void);

Насколько мне известно, это функция классов, веб-страница Указатели на функции-члены меня очень далеко, но недостаточно. Вероятно, дефицит терминологии с моей стороны.

Теперь, Я создал свой собственный класс, который, в свою очередь, хотел бы использовать эту библиотеку SimpleTimer. Но если я скармливаю SimpleTimer свои функции класса, они ему не нравятся (насколько я понимаю). Но как это можно сделать без изменение библиотеки SimpleTimer.

Итак, есть класс Robot, который имеет Robot :: halt () . Я хочу, чтобы робот двигался вперед на определенное время нет времени. Примерно так:

void Robot::forward(int speed, long time) {
    reset();
    timer.setTimer(time, c_func, 1);

    analogWrite(l_a, speed);
    analogWrite(r_a, speed);
    isMoving(true);
}

void Robot::halt() {
    __isMoving = false;
    digitalWrite(r_a, LOW);
    digitalWrite(r_b, LOW);
    digitalWrite(l_b, LOW);
    digitalWrite(l_a, LOW);
}

Переменная c_func на данный момент является бесклассовой функцией, но я хотел бы использовать функцию Robot :: halt . Я смотрел, читал, узнал, но пока не добился успеха. Я просто не могу осмыслить это, потому что мне не хватает угла.

Я пробовал:

timer.setTimer(time, (this->*halt), 1);
timer.setTimer(time, Robot::*halt, 1);
timer.setTimer(time, &Robot::halt), 1);

Но все это равнялось бы той же проблеме / я просто колю здесь в темноте...

РЕДАКТИРОВАТЬ

Ранее я сказал, что не хочу изменять код библиотеки SimpleTimer. Я хочу вернуться к этому, я думаю, что было бы лучше изменить его.

Спасибо за все текущие ответы, мне разрешили пометить только один как жизнеспособный, на самом деле все, что я здесь прочитал, было чрезвычайно полезно.

Чтобы продолжить, изменим код SimpleTimer. У этого класса должна быть ссылка на объект, который содержит мою функцию остановки, верно? Итак, перегрузка функции settimer на что-то, что принимает мой объект и мою функцию как два отдельных указателя, будет работать ...? Я думаю, что у меня это получается, но я еще не дошел до этого с головой.

РЕДАКТИРОВАТЬ

Я не знаю, кто пришел с этим снова, но кто-нибудь найдет эту ветку. Если найдены Указатели на функции-члены и самые быстрые из возможных делегатов C ++ , чтобы дать очень хорошее введение в указатели на функции и указатели на функции-члены.

РЕДАКТИРОВАТЬ

Все заработало, изменил библиотеку SimpleTimer, чтобы использовать эту систему делегирования: http://www.codeproject.com/KB/cpp/FastDelegate.aspx

Он очень хорошо интегрирован, и было бы неплохо иметь такую ​​стандартную систему делегирования в библиотеке Arduino.

Код как в тесте (рабочий)

typedef

typedef FastDelegate0<> FuncDelegate;

Код в классе робота:

void Robot::test(){
    FuncDelegate f_delegate;
    f_delegate = MakeDelegate(this, &Robot::halt);

    timer.setTimerDelg(1, f_delegate, 1);
}

void Robot::halt() {
    Serial.println("TEST");
}

Код в классе SimpleTimer:

int SimpleTimer::setTimerDelg(long d, FuncDelegate f, int n){
    f();
}

Arduino печатает TEST в консоли.

Следующим шагом помещаем его в массив, не вижу там особых проблем. Спасибо всем, не могу поверить в то, чему я научился за два дня.

Что это за запах? Это запах ...? Успех!

Для тех, кто заинтересован, используемая система делегирования не означает проблем с объемом памяти: С FastDelegate

AVR Memory Usage
----------------
Device: atmega2560

Program:   17178 bytes (6.6% Full)
(.text + .data + .bootloader)

Data:       1292 bytes (15.8% Full)
(.data + .bss + .noinit)


Finished building: sizedummy

Без FastDelegate:

AVR Memory Usage
----------------
Device: atmega2560

Program:   17030 bytes (6.5% Full)
(.text + .data + .bootloader)

Data:       1292 bytes (15.8% Full)
(.data + .bss + .noinit)


Finished building: sizedummy

12
задан Peter Mortensen 28 February 2012 в 20:26
поделиться