|
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
|
|||||||||||
указатели на элементы класса11.09.2012, 18:57. Показов 7527. Ответов 22
Метки нет (Все метки)
Здравствуйте!
есть код:
Вот не могли бы вы поподробней рассказать про то что из себя этот указатель представляет,а то не очень понятно... и есть что-то, что позволяет достать адрес элемента класса, начинается по-моему на __co...и как-то связанно с __thiscall И вообще для чего нужны эти указатели, что на методы класса, что на обычные функции?
0
|
|||||||||||
| 11.09.2012, 18:57 | |
|
Ответы с готовыми решениями:
22
Указатели и элементы класса Указатели на метод класса Указатели на объекты класса |
| 11.09.2012, 19:14 | |
|
Указатель на поле класса/структуры Foo это не *, а Foo::*.
Чтобы получить значение по этому указателю, помимо него самого нужен еще указатель на экземпляр объекта Foo. Указатели на функции нужны для более гибкого, настраиваемого поведения. Например сортировка, передал указатель на один предикат - отсортировал по возрастанию, другой - по убыванию, и так далее. Так указатели на функции нужны для обратных вызовов. В общем, применений много.
0
|
|
|
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
|
||
| 11.09.2012, 19:27 [ТС] | ||
|
можете какой-нибудь простенький пример-код привести, где невозможно обойтись без указателя на функцию/метод?
0
|
||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||
| 11.09.2012, 19:37 | ||
|
Alberto_Timakov,
0
|
||
| 11.09.2012, 19:44 | |||||||||||||||||||||||
Пример 1: создание окна средствами WinAPI
Пример 2: сортировка контейнера
P.S. Сказанное относится только к указателям на обычные функции, с указателем на метод такое не прокатит, для его вызова вообще синтаксис особый, с использованием ->*, а чтобы создать такой указатель оператор & обязателен.
1
|
|||||||||||||||||||||||
|
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
|
|||||||||
| 11.09.2012, 21:07 [ТС] | |||||||||
Ну т.е. конечно глупость сморозил, т.к. передается значение, а не функция. Добавлено через 2 минуты
0
|
|||||||||
| 11.09.2012, 21:23 | ||||||
Можно посмотреть на это с другой стороны - любому методу экземпляра (то бишь нестатическому) неявно передается указатель на экземпляр (this), поэтому при отсутствии экземпляра тебе не достает одного параметра для передачи его методу. Скобочки вокруг выражения типа (object.*memberPtr)() или (objectPtr->*memberPtr)() приходится ставить, чтобы разрешить неоднозначность в грамматике C++.
0
|
||||||
|
Комп_Оратор)
|
||
| 11.09.2012, 21:25 | ||
|
0
|
||
|
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
|
|
| 11.09.2012, 21:29 [ТС] | |
|
0
|
|
| 11.09.2012, 21:36 | ||||||||
0
|
||||||||
|
Комп_Оратор)
|
||
| 11.09.2012, 21:41 | ||
|
Методы класса - достояние класса и их адрес получается в конечном счёте через класс (тип данных и связанных с ними методов), а не через экземпляр - переменную класса (типа). Хотя в записи это может выглядеть именно так.
1
|
||
|
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
|
|
| 11.09.2012, 21:44 [ТС] | |
|
Герцто, что у тебя после кода, я каким то образом пропустил. Спасибо=))
0
|
|
|
~ Эврика! ~
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
| 11.09.2012, 22:46 | |
|
1
|
|
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
| 11.09.2012, 22:56 | |
|
~OhMyGodSoLong~, виртуальные таблицы используются только при динамическом связывании. При статическом все вычисляет компилятор во время компиляции.
0
|
|
| 11.09.2012, 23:58 | ||
http://liveworkspace.org/code/... 255f346c27 При появлении виртуальной функции размер пустого класса возрос с 1 байта до 4, то есть как раз на размер указателя на vtable для 32-битной машины.
0
|
||
|
Комп_Оратор)
|
||
| 12.09.2012, 00:12 | ||
0
|
||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
| 12.09.2012, 04:06 | ||||||
|
Если подумать, то для вызова невиртуального метода через указатель,
живой объект не очень то и нужен. Ведь не нужно шарится по таблице виртуальных функция для поиска правильной функции. С указателем на виртуальный метод совсем другое, потому что таблица виртуальных функция находится по смещению относительно адреса объекта, для которого этот метод зовется. Что стандарт говорит относительно первого утверждения - хз, но студия и компилер из ссылки делают вызов невиртуального метода имея нулевой указатель на объект. То, что в методе this оказывается равным нулю - это уже отдельная история. Если к полям класса не обращатся, ничего не упадет. http://liveworkspace.org/code/... 92b61a7bfd Далее, вот например указатель на метод: typedef void (Foo::*MethodPtr)(); Тут нигде не кодируется его виртуальность\невиртуальность. Поэтому, можно прикинуть, что компиляторы реализуют указатели на методы в виде какой-то структуры, в которой есть флажок о виртуальности\невиртуальности метода и другие поля, позволяющие сделать правильный вызов. Для невиртуальных методов будет использоваться поле, в которой указатель на метод похож на указатели на свободные функции (с учетом того, что сигнатура несколько расширена за счет неявной передачи this и может быть соглашения о вызове другие). А вот в случае указателя на виртулальный метод используются другие поля. Например просто индекс функции в таблице виртуальных функций, ведь для вызова виртуального метода через указатель нужен сам объект для определения, где таблица функций и смещение на указатель к нужному методу. Ну примерно это можно было бы описать так:
0
|
||||||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
| 12.09.2012, 04:06 | ||||||
|
Если подумать, то для вызова невиртуального метода через указатель,
живой объект не очень то и нужен. Ведь не нужно шарится по таблице виртуальных функция для поиска правильной функции. С указателем на виртуальный метод совсем другое, потому что таблица виртуальных функция находится по смещению относительно адреса объекта, для которого этот метод зовется. Что стандарт говорит относительно первого утверждения - хз, но студия и компилер из ссылки делают вызов невиртуального метода имея нулевой указатель на объект. То, что в методе this оказывается равным нулю - это уже отдельная история. Если к полям класса не обращатся, ничего не упадет. http://liveworkspace.org/code/... 92b61a7bfd Далее, вот например указатель на метод: typedef void (Foo::*MethodPtr)(); Тут нигде не кодируется его виртуальность\невиртуальность. Поэтому, можно прикинуть, что компиляторы реализуют указатели на методы в виде какой-то структуры, в которой есть флажок о виртуальности\невиртуальности метода и другие поля, позволяющие сделать правильный вызов. Для невиртуальных методов будет использоваться поле, в которой указатель на метод похож на указатели на свободные функции (с учетом того, что сигнатура несколько расширена за счет неявной передачи this и может быть соглашения о вызове другие). А вот в случае указателя на виртулальный метод используются другие поля. Например просто индекс функции в таблице виртуальных функций, ведь для вызова виртуального метода через указатель нужен сам объект для определения, где таблица функций и смещение в этой таблице чтобы получить указатель на правильную функцию. Флажок виртуальности\невиртуальности проверяется в рантайме. Ну примерно это можно было бы описать так:
1
|
||||||
|
Комп_Оратор)
|
||
| 12.09.2012, 13:56 | ||
|
DU, я совсем не уверен в том, что сейчас скажу. Но есть надежда, что если кого-то зацепит, - получим более конкретную информацию.
![]() С моей точки зрения объект наследующего класса, объявленный через указатель базового класса не теряет ведь, своей типовой принадлежности (конструктор же свой используется), поэтому информация о смещении, в данном случае находится в базовом классе. В экземпляре, - информация о том относительно какого класса (наследника) смещение, ну и конечно this... Не по теме:
Простите за оффтоп:friends:
0
|
||
| 12.09.2012, 13:56 | |
|
Помогаю со студенческими работами здесь
20
Указатели на члены класса Конструкторы и указатели на объект класса ООП - Указатели на функции члены класса Потоки и указатели (в поток вставить объект класса) Как на практике используются указатели на члены класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|