Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/88: Рейтинг темы: голосов - 88, средняя оценка - 4.58
Мой лучший друг-отладчик!
167 / 167 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
1

typedef и указатель на функцию

26.12.2012, 19:18. Показов 17417. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Помогите пожлауйста с пониманем одного момента...

Так вот, есть оператор typedef.Он насколько я понял, обьявляет синоним.Напрмер:
C++
1
2
typedef int my;
my up;
То есть my==int, и мы создали переменную типа int.Это понятно.

Далее, у нас есть прототип функции void func(int*,int*), указателем на эту функцию, как я понимаю, будет void (*func)(int*,int*).

Так вот, вопрос - как запихнуть указатель на функцию в typedef, чтобы потом я мог обьявляь переменные с типом указатель на функцию с коротким именем.
В книге есть пример:
C++
1
2
typedef void(*func)(int*,int*);
func p1;
Но я не понимаю этот пример - мы же в typedef запихнули только заменяемое вроде, а на что оно заменяется, мы не написали.Но всё это работает.

Вообщем, вопросов очень много касательно этой темы.Если можно, обьсните подробно данную тему.Заранее благодарю
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2012, 19:18
Ответы с готовыми решениями:

Записать указатель на функцию, не используя typedef
Имеется переменная - указатель на функцию fptr. Написать эту же переменную fptr, не используя...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая...

Указатель на шаблон класса через typedef
Здравствуйте. Возникла следующая проблема: захотел определить указатель на класс с template при...

typedef (указатель на ф-ю) newtype, как сделать?
пытался затайпдефить указатель но чего-то никак( просто указатель работает, а как пытаюсь...

16
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
26.12.2012, 19:31 2
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
Но я не понимаю этот пример - мы же в typedef запихнули только заменяемое вроде, а на что оно заменяется, мы не написали.Но всё это работает.
Мы запихнули идентификатор func.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.12.2012, 19:33 3
Я тоже часто теряюсь от такого синтаксиса
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
typedef void(*func)(int*,int*);
тут как бы
Код
func  ==  void xxx (int*,int*);
1
Мой лучший друг-отладчик!
167 / 167 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
26.12.2012, 19:37  [ТС] 4
go, а почему тогда нельзя писать
C++
1
typedef void(*)(int*,int*) func;
Добавлено через 3 минуты
Avazart, поподробнее пожалуйста расскажите про ваш пример
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.12.2012, 19:37 5
А кто его знает, такую нелогичность - наверное так было проще реализовать.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
26.12.2012, 19:39 6
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
go, а почему тогда нельзя писать
Потому, что typedef это не простая подстановка. Почитайте про синтаксис, чтобы не путаться. Не путайте с define.
1
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
26.12.2012, 19:41 7
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
go, а почему тогда нельзя писать
C++
1
typedef void(*)(int*,int*) func;
А почему нельзя писать так?
C++
1
void (*)(int*,int*) func;
Или так:
C++
1
void ()(int*,int*) func;
Здесь проблема не в typedef, а в синтаксисе объявления указателя на функцию, с которым вам придется мирится.

Запомните главное правило - синтаксис typedef точно так же, как и синтаксис обычного объявления переменной без typedef'а.
4
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
26.12.2012, 19:55 8
ZaMaZaN4iK, http://msdn.microsoft.com/ru-r... sfztk.aspx почитай.

Цитата Сообщение от prazuber Посмотреть сообщение
Запомните главное правило - синтаксис typedef точно так же, как и синтаксис обычного объявления переменной без typedef'а.
Не правда. Вот смотрите. Я объявил
C++
1
2
3
4
typedef char* pChar;
 
const pChar a, b, c; // Замените это, как это поймет компилятор, 
// т.е. уберите typedef и сохраните смысл этого объявления :)
3
Мой лучший друг-отладчик!
167 / 167 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
26.12.2012, 19:58  [ТС] 9
go, может я ошибаюсь, но должно получиться как-то так:
C++
1
const char *a,*b,*c;
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
26.12.2012, 20:00 10
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
go, может я ошибаюсь, но должно получиться как-то так:
Нет. Поэтому должны быть typedef'ы как для неконстантных вариантов указателей, так и для константных.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.12.2012, 20:03 11
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
Так вот, есть оператор typedef.Он насколько я понял, обьявляет синоним.
Нет. typedef объявляет новый тип, как type на паскале. Можно его юзать и для создания синонимов, но его возможности несопоставимо шире.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.12.2012, 20:05 12
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет. typedef объявляет новый тип, как type на паскале. Можно его юзать и для создания синонимов, но его возможности несопоставимо шире.
Да нет не новый.. typeid проверьте...
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
26.12.2012, 20:07 13

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
typedef объявляет новый тип, как type на паскале.
Да ладно :)



Добавлено через 1 минуту
taras atavin, вот синтаксис
Код
typedef type-declaration synonym;
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.12.2012, 20:09 14
А как же тогда указательные типы, в том числе, на функции?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.12.2012, 20:14 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <typeinfo>
//----------------------------------
int main()
{
typedef int my;
 
std::cout <<  typeid(int).name() << std::endl;
std::cout <<  typeid(my).name() << std::endl;
 
return 0;
}
Добавлено через 31 секунду
Цитата Сообщение от taras atavin Посмотреть сообщение
А как же тогда указательные типы, в том числе, на функции?
А что с ними ?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.12.2012, 20:15 16
Так здесь то синоним.

Добавлено через 48 секунд
Цитата Сообщение от Avazart Посмотреть сообщение
А что с ними ?
Ну в синтаксис декларации синонимов они ни как не лезут, хоть копром забивай.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
26.12.2012, 20:21 17
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну в синтаксис декларации синонимов они ни как не лезут, хоть копром забивай.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <typeinfo>
 
typedef void (my)(int);
 
void m(int);
 
int main()
{
    std::cout <<  typeid(m).name() << std::endl;
    std::cout <<  typeid(my).name() << std::endl;
    std::system("pause");
    return 0;
}
0
26.12.2012, 20:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2012, 20:21
Помогаю со студенческими работами здесь

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Друзья! Всем привет. Вот код: class otets { public: void f (void (otets::*p)()); ...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая...

Указатель на функцию, которая принимает в качестве параметра указатель на массив
я не понимаю. вроде делаю правильно, но выходит ошибка. есть функция. int foo(int *mas){};...

Передача умного указателя в функцию принимающую указатель на указатель
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru