Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Константы процедурного типа - C++

14.04.2011, 11:04. Просмотров 1836. Ответов 19
Метки нет (Все метки)

Под процедурным типом я понимаю тип указателя на подпрограмму, как это принято в паскале. Поддерживает ли с++ константы процедурного типа и как их декларировать? Пусть например, есть функция с прототипом
C++
1
void f();
. Как объявить константу с адресом этой функции? А лучше даже так: как в типе структуры декларировать поле типа указателя на f и как потом декларировать константный массив структур этого типа?

Добавлено через 29 минут
Так:
C++
1
2
3
4
5
6
typedef void (*voidfuntionvoid)();class TCommand
{
 public:
  char *text;
  voidfuntionvoid proc;
};
можно? Как потом объявить константный массив типа TCommand?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2011, 11:04     Константы процедурного типа
Посмотрите здесь:

Разработка классов. Переделка из процедурного программирования - C++
Имею отличный строчный калькулятор, сделанный через процедурное программирование, который мне надо реализовать через ООП - через класс. ...

Стринговые константы в С++ - C++
Програмка не работает. Обьясните,пожалуйста,в чем проблема... Само задание звучит так: Вести стринговые константы,найти наибольшое...

Указатели и константы - C++
В чем разница между записью const int * a и int * const a? Где то в книге читал, забыл, теперь не могу найти. Заранее спасибо!

Константы, decltype - C++
Суть в том, что, если тип не есть класс, то при определении типа cv-квалификаторы отбрасываются. А сам объект остаётся...

Статическе константы - C++
Для чего используют статические константы?

Указатели на константы - C++
Поясните. Запутался в нескольких примерах. С++ 11 стандарт. 1.int i=0, &r=i; auto a=r; const int ci=i,&cr=ci; auto b=ci; auto...

символьные константы - C++
введите последовательность н- символьных констант, считать, что количество символов в слове не больше 20. 1.количество слов, что состоят...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.04.2011, 11:19     Константы процедурного типа #2
taras atavin, Указатели на функции.
std::function/boost::function.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.04.2011, 11:42  [ТС]     Константы процедурного типа #3
Цитата Сообщение от ForEveR Посмотреть сообщение
Указатели на функции.
Где они подробно описаны?
Цитата Сообщение от ForEveR Посмотреть сообщение
std::function/boost::function.
Желательно всё таки без лишних прибамбасов. Если придётся лепить какую то сложную конструкцию для каждйо ветви, то где выигрыш по сравнению с ифами?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.04.2011, 14:06     Константы процедурного типа #4
taras atavin, Почему все что новое и прогрессивное, не уступающее по быстродействию сразу сложное? Ни в std::function ни в boost::function ничего сложного нету.

Если это сложно - тогда конечно да.
C++
1
2
3
4
5
6
void some_foo(int)
{
}
 
std::function<void(int)> f_obj;
f_obj = some_foo;
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.04.2011, 16:53     Константы процедурного типа #5
А чем обычный указатель на функцию не устраивает?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void f()
{ ... }
void f2()
{ ... }
 
typedef void (*voidfuntionvoid)();
 
class TCommand
{
 public:
    TCommand( char * name, voidfuntionvoid ptr )
      : text(name),
       proc( ptr )
    { }
 
  char *text;
  voidfuntionvoid proc;
};
 
const TCommant c[2] = { TCommand( "name", f ), TCommand( "name2" ,f2) };
С точки зрения инициализации не будет отличаться от любой другой константы.

Добавлено через 22 минуты
Хотя, лучше всё же использовать функторы. Тогда будет проще поддерживать функции с различным числом и типами параметров.
Evg
Эксперт CАвтор FAQ
17551 / 5789 / 370
Регистрация: 30.03.2009
Сообщений: 15,941
Записей в блоге: 26
14.04.2011, 21:52     Константы процедурного типа #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ForEveR Посмотреть сообщение
Почему все что новое и прогрессивное, не уступающее по быстродействию сразу сложное?
Примерно потому: Какой язык лучше учить?

А вообще иногда оказывается, что проще объявлять не тип указателя на функцию, а просто тип функции. А при объявлении указателя добавлять звёздочку к имени переменной. Тогда с таким типом можно будет ещё и внешние функции описывать

C
1
2
3
4
5
6
7
8
9
10
11
12
typedef void (func_type_t)(int, int);
 
/* Эквивалентно extern void f1 (int, int); */
extern func_type_t f1;
 
/* Эквивалентно extern void f2 (int, int); */
extern func_type_t f2;
 
/* Константный массив из двух указателей на функцию.
 * Здесь уже рисуем явную звёздочку после типа, явным образом
 * обозначая, что это указатель */
func_type_t* const a[2] = { f1, f2 };
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.04.2011, 22:19     Константы процедурного типа #7
Evg, Ну не скажи. boost::function удобнее чем указатели на функции да и к тому же функциональнее + высокий уровень. По-моему в этом нет ничего плохого.
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
14.04.2011, 22:40     Константы процедурного типа #8
При неумелом обращении с указателями на функции можно элементарно уложить свой процесс и сидеть ковырять в носу над дебагом. Взамен Вам предлагается готовое, стабильное решение, которое не засоряет код новыми типами.
Evg
Эксперт CАвтор FAQ
17551 / 5789 / 370
Регистрация: 30.03.2009
Сообщений: 15,941
Записей в блоге: 26
14.04.2011, 22:51     Константы процедурного типа #9
А чтобы 2+3 сложить, тоже boost надо использовать? Или может как в линуксе, установить ещё какую-нибудь ацкую библиотеку, которая в зависимости ещё 30 других библиотек потащит. Зато 2+3 по-пацански сложим, надёжно. Я это всё к тому, что есть встроенные средства языка, а ради несчастного указателя на функцию тащить буст - это моветон

> При неумелом обращении с указателями

При кривых руках тебя и boost не спасёт
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.04.2011, 22:55     Константы процедурного типа #10
Evg, А std::function?)
Ну и boost::function может использоваться в разных ситуациях.

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

Надо распарсить выражение - с реджексом все получится отлично, но тащить boost::regex в проект это моветон, поэтому будем писать свой парсер.

Надо написать некую вещь, где удобнее boost::lambda - но нееет, тащить boost::lambda это перебор.

Да и еще кучу примеров можно привести, вплоть для описания короткой грамматики, с которой лучше может справится spirit, но нет, будем лучше писать свою.
Evg
Эксперт CАвтор FAQ
17551 / 5789 / 370
Регистрация: 30.03.2009
Сообщений: 15,941
Записей в блоге: 26
14.04.2011, 23:09     Константы процедурного типа #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Надо распарсить выражение
Для тебя действительно "распарсить выражение" и "указатель на функцию" это вещи одного и того же порядка сложности? Т.е. числа складываешь ты без boost'а только потому, что в boost'е этого нет?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.04.2011, 23:18     Константы процедурного типа #12
Evg, Нет не поэтому) В основном не одно и то же. Я просто привел пример, меня сильно удивляет, что в С++ ты предлагаешь использовать указатели на функции, которые в С++ никуда не впились, тем паче, что есть готовые решения, тащить boost::function в проект, если есть такая возможность - не считается моветоном. Проект на чистом С++ с использованием STL, RAII по-максимуму и вдруг создание указателя на функцию - смотрится убого, использование function - смотрится красиво и что важнее удобно. Это сейчас задача такова, что просто достаточно сделать указатель на функцию, а завтра может понадобится использовать что-то для чего без использования библиотек - придеться делать все через задницу.
Да без смысла спорить на самом деле. Каждый все равно останется при своем мнении.
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
14.04.2011, 23:31     Константы процедурного типа #13
Цитата Сообщение от Evg Посмотреть сообщение
А чтобы 2+3 сложить, тоже boost надо использовать? Или может как в линуксе, установить ещё какую-нибудь ацкую библиотеку, которая в зависимости ещё 30 других библиотек потащит. Зато 2+3 по-пацански сложим, надёжно. Я это всё к тому, что есть встроенные средства языка, а ради несчастного указателя на функцию тащить буст - это моветон

> При неумелом обращении с указателями

При кривых руках тебя и boost не спасёт
Убавь громкость, дружок. Для домашнего задания поинтеров хватает с головой, а для крупного проекта такой подход выливается в качественный говнокод.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.04.2011, 23:38     Константы процедурного типа #14
Evg, Ну и выражение бывает различным... Допустим надо нам проверить совпадает ли строка с паттерном пять цифр и возможны буквы в верхнем или нижнем регистре.

Можно использовать regex.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include <regex>
 
int main()
{
    std::regex pattern("\\d{5}[a-zA-Z]*");
    std::string str;
    std::cin>>str;
    std::smatch match;
    if(std::regex_match(str, match, pattern))
        std::cout<<"Matched\n";
    else
        std::cout<<"Not matched\n";
    system("pause");
}
А можно писать что-то твое. Длиннее не будет, но на кой изобретать велосипед, когда все уже есть?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2011, 23:46     Константы процедурного типа
Еще ссылки по теме:

Ввод константы - C++
Имеется массив. Нужно чтоб пользователь вводил его размер, но для этого нужно чтоб переменная была константой. Вопрос как сделать так чтоб...

Не различает константы - C++
Добрый вечер. Есть константы в базовом классе:protected: ... // тут enum'ы и структуры const QString FORMAT_DIR = &quot;format&quot;; ...

константы в классах - C++
в классе используется константа типа double. Как правильно задать ее? как static const double внутри класса или просто написать...

Вычисляемые константы - C++
Можно ли сделать так, чтобы сначала вычислить, а затем сделать константой?

встроенные константы в С++ (pi e) - C++
Подскажите, существуют ли в С++ встроенные константы. Например pi=3.14.... или e=2.71.... Если да, то как их вызвать. Если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17551 / 5789 / 370
Регистрация: 30.03.2009
Сообщений: 15,941
Записей в блоге: 26
14.04.2011, 23:46     Константы процедурного типа #15
Цитата Сообщение от ForEveR Посмотреть сообщение
Проект на чистом С++ с использованием STL, RAII по-максимуму и вдруг создание указателя на функцию - смотрится убого, использование function - смотрится красиво и что важнее удобно. Это сейчас задача такова, что просто достаточно сделать указатель на функцию, а завтра может понадобится использовать что-то для чего без использования библиотек - придеться делать все через задницу.
Цитата Сообщение от Manjak Посмотреть сообщение
Для домашнего задания поинтеров хватает с головой, а для крупного проекта такой подход выливается в качественный говнокод.
Где вы большой проект увидели? Человек задал вполне конкретный вопрос: как сделать массив из указателей на функцию. Он не спрашивал, через какие нанобиблиотеки можно реализовать встроенную конструкцию языка. И не спрашивал о том, какие бы библиотеки надо затащить в проект, чтобы он не выглядел убого. Он всего лишь задал простой вопрос про указатель на функцию

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

Добавлено через 4 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
Evg, Ну и выражение бывает различным... Допустим надо нам проверить совпадает ли строка с паттерном пять цифр и возможны буквы в верхнем или нижнем регистре
В Си или в Си++ есть встроенные (в язык или в стандартную библиотечную поддержку) средства для работы с регулярными выражениями? Нет. Так зачем их сравнивать с указателями на функцию?
Yandex
Объявления
14.04.2011, 23:46     Константы процедурного типа
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru