Заблокирован
|
|||||||||||
1 | |||||||||||
непонятная конструкция, шаблоны30.07.2011, 17:28. Показов 3107. Ответов 38
Метки нет (Все метки)
столкнулся со странной конструкцией
видел объяснения на русском, на инглише, что это мол какой-то указатель на член, всё равно не догоняю. Может кто-нибудь доходчиво объяснить или хотя привести примеры зачем это нужно ну кроме как здесь? Всё остальное понятно, мне бы этот момент главное прояснить. Заранее спасибо
0
|
30.07.2011, 17:28 | |
Ответы с готовыми решениями:
38
Шаблоны классов: непонятная ошибка в одном из методов класса Непонятная конструкция в C++ «Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис) |
Freelance
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
|
|
30.07.2011, 17:36 | 2 |
Из Шилдта:
1
|
Заблокирован
|
|
30.07.2011, 17:40 [ТС] | 3 |
а это какая именно из его книг(и глава желательно). Там подробно написано про это явление? Хотелось бы знать, что это за зверь ну на случай, вдруг если сам захочу придумать "исключительную ситуацию"
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
30.07.2011, 17:48 | 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
LosAngeles, смотри сюда:
Дело в том, что указатель на метод существенно отличается по типу от обычного указателя на функцию, даже если прототипы функции и метода внешне идентичны. Вспомним, как определяется указатель на функцию
либо явно задавая операцию получения адреса,
Вызов функции через указатель выполняется опять же либо так:
Рассмотрим несколько простых примеров. Допустим, у нас объявлен указатель на функцию
объявить объект и взять адрес метода в объекте; не объявлять объект, а приписать префикс класса.
Аналогично, нельзя присвоить обычному указателю на функцию адрес виртуального метода — в этом случае дело усугубляется еще наличием в составе объекта указателя на таблицу виртуальных методов. А вот со статическими методами картина другая! Статический метод не получает никаких «лишних параметров», поэтому его адрес можно присваивать обычному указателю на функцию без всяких преобразований. Добавим в класс Constant статическое поле и статический метод с нужным нам прототипом:
Указатель на метод объявляется по-другому [1-8.3.3] — нужно задать префикс-имя класса:
И косвенный вызов метода выполняется по-другому — с помощью операции выбора члена класса .* или ->* [1-5.5]. Несмотря на то, что указатель на член класса является отдельной, независимой от класса переменной, вызов метода по указателю возможен только при наличии объекта, например
В выражении (объект.*указатель) можно заменить часть «объект.» на «указатель->», например
Интересно, что в системе Visual C++.NET 2003 размер sizeof(pf) указателя на функцию совпадает с размером sizeof(pm) указателя на член класса и равен 4 байта. А вот система Borland C++ Builder 6 выдает совершенно разные цифры: размер указателя на функцию равен 4 байтам, а размер указателя на метод — 12 байт!
11
|
Freelance
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
|
|
30.07.2011, 17:48 | 5 |
Герберт Шилдт - Полный справочник по C++.
К сожелению, не совсем, автор просто дает понять что это такое, не углубляясь.
1
|
Заблокирован
|
|
30.07.2011, 18:16 [ТС] | 6 |
ValeryLaptev, спасибо огромное! грамотно всё разложил. Такой бы пост надо в какой-нибудь faq затолкать. Я думал, что знаю о указателях всё до твоего поста оказывается нет...
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
30.07.2011, 18:21 | 7 |
можно радоваться, что это уйдет в прошлое с появлением std::function в стандарте
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
30.07.2011, 18:30 | 8 |
В принципе, если админы-модераторы поддержат, то можно много чего наверху закрепить...
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
30.07.2011, 19:45 | 9 |
Только вот у ТС отсутствует список аргументов, при объявлении указателя на метод... Разве так можно?
0
|
Заблокирован
|
|
30.07.2011, 19:56 [ТС] | 10 |
вроде как можно. В g++ работаеет
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
30.07.2011, 19:57 | 11 |
0
|
Заблокирован
|
|
30.07.2011, 20:25 [ТС] | 13 |
наверно так, если такая терминология уместна. Наверно это неявно преобразуется в int (C::*p)(void) или что-то типа того универсальных указателей ведь нет? Кстати если в FAQ это добавлять надо ещё добавить что спецификатор const обязателен, если метод был с ним объявлен, а спецификация исключений вроде необязательна должна совпадать, у меня по крайней мере так
0
|
Заблокирован
|
|
30.07.2011, 20:47 [ТС] | 15 |
а что тогда можно присвоить р?
0
|
30.07.2011, 22:08 | 16 | ||||||||||
Сижу, методом тыка пытаюсь определить - это вообще что?
Арифметические операции к этому p не применяются (ошибка компиляции), оператор разыменования указателя тоже. Присвоить какое-то значение ему невозможно, если вывести это p, то выводится просто 1. Пробую вызывать ф-цию по-разному, не указатель на int, не указатель на функцию типа int(*)() в качестве аргумента неприемлемы (ошибка компиляции). Но сама строка:
P.S. у меня C - это просто класс. Добавлено через 2 минуты Да, оператор () тоже неподходит... Добавлено через 45 минут LosAngeles, вот нашел в википедии:
1
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
31.07.2011, 07:04 | 18 |
Не, не фэйл. Порекомендую ещё раз прочесть Александреску (если после прошлой рекомендации ещё не успели прочитать.) ) про функциональные объекты.
Вероятно, так и есть. Но смысл действа не ясен. Почему там просто указатель на int не передаётся? Ничё не понятно... Если кто понял сакральный смысл этого действа, разъясните тугодуму, плиз.)
0
|
Заблокирован
|
|
31.07.2011, 07:15 [ТС] | 19 |
если указатель на инт передавать, то первый вариант будет компилироваться всегда вне зависимости от Т вроде как
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
31.07.2011, 07:19 | 20 |
0
|
31.07.2011, 07:19 | |
31.07.2011, 07:19 | |
Помогаю со студенческими работами здесь
20
Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны Непонятная конструкция Непонятная конструкция Непонятная конструкция Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |