Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатели на функции, несколько вопросов на одну тему 
V
    Опции темы
Alek86
Дата 25.2.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



вот решил понять получше, что есть указатели на функции
в связи с этим несколько вопросов появилось (скорее всего детских):

пусть есть:
Код


typedef void (*Func)();
void func() {}



1. Наивный вопрос, но хочется уточнить. НИКАК нельзя в стандартном C++ сделать прямую зависимость между типом Func и func, как функцией этого типа?

2. что представляет собой выражение *func?

3. почему нет разницы между func и &func? Или есть?

4. если передавать в функцию указатель на другую функцию, то какой-то шутник (или просто невнимательный человек) может передать туда 0. Потому приходится все время проверять на 0 перед вызовом по указателю. Есть ли для функций механизм, похожий на ссылочный, который "гарантирует", что передается непустое значение?


--------------------
user posted image    user posted image
PM MAIL   Вверх
Daevaorn
Дата 25.2.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Литературку читать не пробовал и поиском пользоваться?
PM MAIL WWW   Вверх
Alek86
Дата 25.2.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



да, может есть у кого на примете статья, где рассматривается подноготная указателей на функции?
к примеру, интересует, 

5. всегда ли компилятор может оптимизировать вот такое:
Код

struct A {
  virtual void F() {PRINT_VALUE(1);}
};
struct B : A {
  virtual void F() {PRINT_VALUE(2);}
};

int main() {
  A a;
  B b;
  A& r_b = b;

  a.F() // вызов функции как невиртуальной (не через указатель)
  b.F() // вызов функции как невиртуальной (не через указатель)
  r_b.F() // вызов функции как виртуальной (деваться же некуда)
}


Добавлено через 2 минуты и 3 секунды
Цитата(Daevaorn @  25.2.2008,  18:04 Найти цитируемый пост)
Литературку читать не пробовал и поиском пользоваться?

в детстве Незнайку читал smile

пытался найти ответ на первый вопрос, но не смог - даже составить текст запроса на поиск. Если даш "литературку", где ответы на эти вопросы написаны, буду благодарен


--------------------
user posted image    user posted image
PM MAIL   Вверх
Daevaorn
Дата 25.2.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Alek86 @  25.2.2008,  19:06 Найти цитируемый пост)
пытался найти ответ на первый вопрос, но не смог - даже составить текст запроса на поиск. Если даш "литературку", где ответы на эти вопросы написаны, буду благодарен 

"Бьерн Страуструп. Язык программирования С++"
PM MAIL WWW   Вверх
Alek86
Дата 25.2.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



ты уверен, что там есть ответы на эти вопросы?
(второй, заметь - это ПОЧЕМУ. В литературке такие подробности редко пишут)

Добавлено через 10 минут и 6 секунд
хоть когда-то и читал, но все же поглядел на главу "4.6.9 Указатель на функцию" из рекомендованной "литературки"
негусто
ни на 1 из вопросов ответа не нашел (хотя дошло, что 2 и 3 взаимосвязанны)

может у кого есть "литературка", где это поглубже рассматривается?


--------------------
user posted image    user posted image
PM MAIL   Вверх
Mayk
Дата 26.2.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134




Цитата(Alek86 @  25.2.2008,  22:02 Найти цитируемый пост)


4. если передавать в функцию указатель на другую функцию, то какой-то шутник (или просто невнимательный человек) может передать туда 0. Потому приходится все время проверять на 0 перед вызовом по указателю. Есть ли для функций механизм, похожий на ссылочный, который "гарантирует", что передается непустое значение? 

а чем
Код

typedef int (&FuncR)();

int func()
{
}


int main()
{
    FuncR ok = func;
    FuncR ctError;
    FuncR ctError2 = 0;
}

не устраивает?


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
marcusmae
Дата 26.2.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Alek86, недавно прочёл вот эту статью : Member Function Pointers and the Fastest Possible C++ Delegates. Весьма и весьма профессиональный рассказ. Не то чтобы я узнал много нового, но все мои разрозненные знания как бы сложились в общую картину smile  Хорошо читаеш по-английски?

Это сообщение отредактировал(а) marcusmae - 26.2.2008, 12:09


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Alek86
Дата 26.2.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата

а чем
...
не устраивает?

устраивает
проблема в том, что я чёто был уверен, что сцылок на функции нету (даже не проверил)...


Цитата(marcusmae @  26.2.2008,  12:08 Найти цитируемый пост)
Хорошо читаеш по-английски?

угу, с моим другом-словарем...
спасибо, посмотрим-с smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
Earnest
Дата 26.2.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Строго говоря, замена указателя ссылкой не спасет от "шутников". Ибо здесь вам C. Например, разыменуем нулевой указатель и передадим. Все прекрасно скомпилируется. Естественно, получишь в runtime исключение, как и при вызове функции по нулевому указателю, только несколько другое. 
То же самое относится и к ссылкам на данные. Ссылка лишь декларирует соглашение - объект должен быть - но никто не мешает нарушать его при желании. Тем не менее функции принято передавать по указателю, а не по ссылке - просто тебя лохо поймут.


--------------------
...
PM   Вверх
Alek86
Дата 26.2.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Earnest @  26.2.2008,  18:03 Найти цитируемый пост)
Строго говоря, замена указателя ссылкой не спасет от "шутников".

Цитата(Alek86 @  25.2.2008,  18:02 Найти цитируемый пост)
похожий на ссылочный, который "гарантирует", что передается непустое значение?

у слова "гарантирует", наверное, не заметила кавычек
все равно, что объвление функции константной "гарантирует", что она не будет менять объект а инкапсуляция "гарантирует" неприкосновенность приватных переменных

но за труды в написании спасибо smile

Цитата(Earnest @  26.2.2008,  18:03 Найти цитируемый пост)
просто тебя лохо поймут.

в смысле плохо? в том, что не только я не знал, что такое ссылка на функцию? ну увидят и просветятся...

лучши скажи, как передать в функтор
Код

struct Functor {
//...
  operator ()() {m_func();}
//...
  FuncR m_func;
};

функцию так, чтобы нормальный оптимизатор вызов
Код
Functor::Functor(func)()

соптимизировал так, чтобы он был аналогичен вызову
Код
func()


MVC 2005 при использовании ссылок оптимизирует их одинаково только если func() не может быть встраиваемой.
иначе же:
Код

  func();
// подстановка функции
  Functor::Functor(func)();
004010AE  call        func (401000h) 

:(


PS. marcusmae, если это есть в той статье, то я ее еще не читал - работа...


--------------------
user posted image    user posted image
PM MAIL   Вверх
Alek86
Дата 27.2.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



существует ли возможность обьявить ссылку на функцию-член класса?
пробовал - не получилось. в стандарте тоже не нашел


--------------------
user posted image    user posted image
PM MAIL   Вверх
marcusmae
Дата 27.2.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Цитата(Alek86 @  27.2.2008,  13:17 Найти цитируемый пост)
существует ли возможность обьявить ссылку на функцию-член класса?пробовал - не получилось. в стандарте тоже не нашел


Цитата

A member function pointer to a member function of class SomeClass, with the same arguments as before, is declared like this:

Код

float (SomeClass::*my_memfunc_ptr)(int, char *);

// For const member functions, it's declared like this:
float (SomeClass::*my_const_memfunc_ptr)(int, char *) const;



А ещё моя тема здесь на форуме : Передать в класс указатель на функцию, если функция - член другого класса

Это сообщение отредактировал(а) marcusmae - 27.2.2008, 14:10


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Alek86
Дата 27.2.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



ключевое слово - "ссылку" smile то есть что-то типа float (SomeClass::&my_memfunc_ptr)(int, char *)

статейку я прочел, и даже + зарядил за нее
кстати, русский вариант



--------------------
user posted image    user posted image
PM MAIL   Вверх
marcusmae
Дата 27.2.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Цитата(Alek86 @  27.2.2008,  14:12 Найти цитируемый пост)
::&


Ого!  smile Если что, "::*" - это целостный специальный оператор для указателей.

Цитата(Alek86 @  27.2.2008,  14:12 Найти цитируемый пост)
ключевое слово - "ссылку"


Ага, я внимательно читаю. Загляни в тему, которую я привёл. В кратце, должно быть что-то вроде

Код

memfuncPtr *memfuncPtrRef; 


То есть, завести амперсанд не выйдет, а вот взять адрес указателя - вполне smile 


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Alek86
Дата 27.2.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(marcusmae @  27.2.2008,  14:30 Найти цитируемый пост)
Ого!

угу... а жаль...
правда ведь если спрошу, почему нету ссылки, то не уверен, что найдется ответ...


Цитата(marcusmae @  27.2.2008,  14:30 Найти цитируемый пост)
 Загляни в тему, которую я привёл.

я во время компиляции передаю в качестве параметра шаблона... не подходит
конечно, проблема решаемая (принимать указатель, и во время компиляции гавкать, если туда 0 записали) но все же...
на обычные функции есть, а на члены - нету :(


--------------------
user posted image    user posted image
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0662 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.