реклама на сайте
подробности

 
 
> Вызов функции по ссылке. WinAvr.
Igor_U
сообщение Oct 6 2006, 06:23
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 2-10-05
Пользователь №: 9 141



Объявлена переменная с ссылкой на функции класса:
class clAutomatic_Mode;
static void (clAutomatic_Mode::*mode_func)(void); // указатель на функцию обработчик
в теле программы присваиваю этой переменной адреса функций, например:
mode_func=&clAutomatic_Mode::HeatInit;
Но не понимаю как сделать вызов функции по адресу в переменной mode_func.
На mode_func(); - выдается ошибка:
Код
main.cpp:77: error: must use .* or ->* to call pointer-to-member function in `mode_func (...)'

Видимо не правильно объвляю. Но как сделать правильно?

В целом я делаю автомат состояний и переходы между состояниями решил организовать переписывая ссылку на функции - показалось удобным. Может есть какой-то более прямой способ для С++?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
freux
сообщение Oct 6 2006, 12:16
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 41
Регистрация: 7-02-05
Пользователь №: 2 473



Смешение культур, какое-то. Если занялись ООП (надеюсь понимаете, что это не Организация Освобождения Палестины), то надо создать иерархию классов от одного общего предка с виртуальной функцией. Вот эти порожденные классы и будут реализацией состояний. Далее, некий менеджер (не тот, что в торговом зале) держит ссылку на конкретную реализацию состояния и вызывает его виртуальный метод. Состояние меняется - порождается новый объект и присваивается на эту ссылку.
class State
{
public:
State();
virtual int mode_func();
}
class State_A : public State
{
public:
State_A();
virtual int mode_func();
}
class State_B : public State
{
public:
State_B();
virtual int mode_func();
}

class State_Manager
{
public:
State_Manager();
..
protected:
State* m_state;
}
где - то в недрах менеджера порождаем первое состояние:
m_state = new State_A();
...
...
выполняем функцию состояния:
int nNewState = m_state->mode_func();

каким -либо образом проверяем результат, и, если есть новое состояние, то порождаем его вместо текущего:
if (nNewState)
{
if (m_state)
delete m_state;
switch(nNewState)
{
case STATE_A: m_state = new State_A(); break;
case STATE_B: m_state = new State_B(); break;
}
}

ну и наверх, опять выполнять функцию состояния.
Есть несколько книг по ООА и шаблонам проектирования, попробуйте их почитать, тренируйтесь на Visual C++, безотносительно контроллера, у него хороший отладчик.

Сообщение отредактировал freux - Oct 6 2006, 12:18
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 15:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01356 секунд с 7
ELECTRONIX ©2004-2016