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

 
 
> Указатели на функции С++, Корректность применения
nice_vladi
сообщение Nov 11 2017, 10:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 7-09-16
Из: Томск
Пользователь №: 93 239



Всем привет.

Начал осваивать С++ и в один прекрасный момент подумал, что было бы не плохо вызывать функции по указателям на них.

Никаких ивентов и тому подобных вещей. При инициализации передал указатель на функцию создаваемому классу - и пожалуйста, он ею щелкает, когда душе угодно. Допустим, что-то на GUI обновляет.

НО! В какой-то момент я задумался о целесообразности применения, да и вообще корректности использования. Приведу пример: есть такая вещь, как goto: Но ее применять не рекомендуется,
потому-что - потому-что.

Есть ли какие-то подобные рекомендации по применению указателей на функции? Ну и вообще, подводные камни, так называемые.

Visual Studio 2013

Спасибо! biggrin.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DASM
сообщение Nov 11 2017, 17:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



https://pro-prof.com/forums/forum/programmi...cplusplus_notes
Чрезвычайно полезный блог. 98 % программеров на Срр толком и не знают, что они делают. О goto
Цитата
Оператор goto это гораздо более порядочный инструмент чем, например, C-style cast, или «сишная» функция exit.

Некоторые авторы все вселенские беды приписывают этому оператору. Они готовы сжечь его на костре как ведьму, если бы это было возможно.

«Ругание» goto — совершенно бессмысленная трата времени и чернил

https://pro-prof.com/forums/topic/6-cplusplus-goto

https://pro-prof.com/forums/topic/7-cplusplus_inheritance
А тут хорошее размышление о наследовании, оное при знакомстве с языком пихают где ни попадя (я в книге прочел) и имеют много проблем. Вообше С++ язык, к которому надо прийти самому, когда надоест ловить глюки на (c-ctyle) cast и подобной хрени.

"из набора, скажем, 100 функций." явно ошибка проектирования, так не бывает. Скорее всего тут подойдет шаблон интерпретатора

Вообще имхо 99% учебников программирования бесполезны. Учить надо проектированию в первую очередь, а какой язык - не так важно
. На ассемблере можно писать прекрасный код, хоть с динамическим полиморфизмом и кучей умных слов, оные есть в каждой книжке, но даются как обезьянам очки

А первый 30 страниц любого "для чайников" стоит начать с UML

И многое сейчас выглядит иначе, чем 10 лет над. Например венегрская нотация - вредная вещь, а количество комментариев к коду - должно стремиться к нулю
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 11 2017, 22:28
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(DASM @ Nov 11 2017, 21:16) *
. . .
"из набора, скажем, 100 функций." явно ошибка проектирования, так не бывает. Скорее всего тут подойдет шаблон интерпретатора
. . . .

Вполне возможно. Но яж выше уточнил, что "когда смысл или необходимость". Привел для примера.
Хотя сам делал с использованием указателей на ф-ии систему многоуровневого и многопунктного меню,
по той причине, чтобы все меню было видно компактно, в виде одного массива-таблицы структур.
Переход между пунктами и между меню - с использованием индексов. Проверено на практике.
С интерпретатором надо будет юлозить по стуктурированному коду.
Еще один из вариантов использования - реализация автоматов или томуподобного.
(база индекса - состояние, смещение - сигнал). Опятьже - например. То что делается стандартно на case-switch.
Но думаю "детали" ТС неинтересны sm.gif

ps - таблицы виртуальных функций.
Я и уточняю у ТС, "онож уже есть" sm.gif

Цитата(nice_vladi @ Nov 11 2017, 14:08) *
. . . Приведу пример: есть такая вещь, как goto: Но ее применять не рекомендуется,
потому-что - потому-что.
. . .

Для программ на ASM использование безусловного перехода JMP addr - аналога goto
никаких ограничений не имеет. Основное при программировании на ASM - правильность-оптимальность
кода, быстродействие. А читабельность определяется "воспитанностью" программиста.
CPP код, в конечном счете, компилируется в ASM код с последующей трансляцией в машинный.
И если посмотреть на этот ASM, то там масса JMP, оноже - как-бы GOTO.
Основная идея "шельмования" goto - ухудшение стрктурированности и читабельности кода.

Я пользуюсь (иногда) такой методой заменяющей goto и не ухудшающей читабельность.

Код
while(1)
{
___if( xxx )  
______yyyyy;
____else
_____ break;    
      . . . . итд много кода (кроме циклов)

____break;
}

Вообще, насколько такой прием корректен ?
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 28th June 2025 - 00:28
Рейтинг@Mail.ru


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