LINUX.ORG.RU

как передать указатель на функцию


0

0

/* подскажите как сделать, например есть класс открытия и работы с портом rs232, как использовать в других классах функции работы с портом не инициализируя при этом порт*/

class _interface
{
public:
interface(){открытие /dev/ttyS0}
read_i();
bool write_i (char *msg);//использует параметры
~interface(){закрытие}
private:
параметры
}


class _timer_one //работа по таймеру
{
public:
bool (*write_i) (char *msg);

}

class _on_button//работа по нажатию кнопок
{
public:
bool (*write_i) (char *msg);
bool press_putton(int n_button);
bool redraw_button();
}

_interface interface;
_timer_one timer_one;
_on_button on_button;

main
{
bool (*timer_one.write_i) (char *msg) = & interface.write_i;//не работает
bool (*on_button.write_i) (char *msg) = & interface.write_i;//не работает

}




anonymous

bool (*write_i) (char *msg); это указатель на функцию, а _interface::write_ это метод класса. Читаем любую книгу по С++ на предмет указателей на методы класса.

Кстати кто тебя учил делать имена с подчеркиванием в начале? В один прекрасный момент напорешься на то, что это будет какой-нибудь макрос в стандартных инклудниках ... И вообще то что ты пытаешься делать обычно реализуется посредством виртуальных функций, а не такого изврата.

Reset ★★★★★
()
Ответ на: комментарий от YesSSS

виртуальные функции тут не подойдут потому что в функции write_i уже содержаться код для обработки поступающих данных и запихивания их в rs232 нужно просто вызвать эту функцию и использовать значения переменных которые получились при инициализации класса

anonymous
()
Ответ на: комментарий от anonymous

Я про такой вариант говорил

class _on_button//работа по нажатию кнопок 
{ 
public: 
interface &i;
bool press_putton(int n_button){
 i.write_i("hello, world\n");
}
bool redraw_button(); 
}


int main(){
interface ii;
on_button.i = ii; 
}

YesSSS ★★★
()

Указатели на функцию в С++ - ересь. В твоём примере можно, как предлагал предыдущий оратор, хранить ссылку на объект класса интерфейса.

ЗЫ: Стиль оформления исходника - ужоснах. Почитай что-нтиь на эту тему. Ну хоть Саттера.

Sectoid ★★★★★
()
Ответ на: комментарий от anonymous

Ты книжки какие-нибудь по Си++ вообще читал или сразу бросился программить? Инициализацию ссылки надо делать в конструкторе, если хочешь инициализировать её позже то используй указатель.

Reset ★★★★★
()
Ответ на: комментарий от anonymous

спасибо YesSSS помогло ушел читать книжки :-)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.