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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
#1

указатели на элементы класса - C++

11.09.2012, 18:57. Просмотров 1642. Ответов 22
Метки нет (Все метки)

Здравствуйте!
есть код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class A
{
    public:
    void C(void){return;}
        static int D(void){return 0;}
    int a;
        static int d;
};
 
int main(int argc, char** argv)
{
        A a_obj;
    int (A:: *p)= &A::a;// - работает
        //int *p= &a_obj.a; - не работает
        //int *p= &A::a; - не работает
        void (A::*f)(void)= &A::C; // - работает
        //void (*f)(void)= &A::C; - Не работает
        //void (*f)(void)= &a_obj.C; - Не работает
        int *e1= &a_obj.a;// - Работает
        int *e2= &A::a;// - Работает
        int (*F1)(void)= &A::D;// - работает
        int (*F2)(void)= &a_obj.D;// - работает
    system("Pause");
    return 0;
}
Знаю, что в не статическую функцию Неявно передается this, т.е. выходит вместо параметра (void), по сути параметр (this) в методе C и т.к. преобразование из в void (A::*)() в void * невозможно, то ошибка, а как тогда объяснить ошибку связанную со строкой :
C++
1
2
3
  
      //int *p= &a_obj.a; - не работает
        //int *p= &A::a; - не работает
в Т.А. Павловская "C/C++ прог. на яз. высокого уровня" пишут, что указатель на элемент класса в отличии от указателя на обычную переменную или функцию, ссылается не на определенный адрес памяти, а больше похож на индекс в массиве, т.к. задает смещение

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

И вообще для чего нужны эти указатели, что на методы класса, что на обычные функции?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,383
Завершенные тесты: 1
12.09.2012, 16:56     указатели на элементы класса #21
Что за смещение? Если Вы говорите о доступе к виртуальным методам, то при компиляции класса содержащего виртуальную функцию ( -ции ) создается таблица виртуальных функций. Фактически каждый объект класса содержит указатель на данную таблицу для своего класса. При обращении через указатель базового класса, указатель разыменовывается, и мы получаем объект производного ( или того же базового класса ). Указатель на таблицу ( vtable ) находится в начале объекта, то есть объект с него начинается. Далее просто берется этот указатель, и разыменовывается. И так мы попадаем непосредственно к vtable, все что остается программе - это сделать смещение, если потребуется ( если виртуальных функций несколько, и требуется не первая в таблице функция ), на некое количество байт ( количество кратно размеру указателя системы ) , и разыменовать полученный адрес, что бы получить доступ к самой функции.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
12.09.2012, 17:45  [ТС]     указатели на элементы класса #22
а обычные функции в vtable не записываются? А то в примерах в инете, приводятся обычно примеры классов содержащих одну вирт функцию и обычную и рисуют вирт. табл. где и обычная функция и вирт. функция находятся...А поля класса где сохр?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2012, 18:03     указатели на элементы класса
Еще ссылки по теме:

Не вводятся элементы в массив(указатели) C++
C++ Просуммировать элементы массива используя указатели
Указатели на члены класса C++
C++ Вывести на экран элементы массива используя указатели
C++ Поменять элементы массива местами используя указатели

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

Или воспользуйтесь поиском по форуму:
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,383
Завершенные тесты: 1
12.09.2012, 18:03     указатели на элементы класса #23
Обычные функции не записываются, для них происходит статическое связывание на этапе компиляции. Я описал лишь один из возможных, и самых частых реализаций полиморфизма. Стандартом языка не оговорена его реализация.
Yandex
Объявления
12.09.2012, 18:03     указатели на элементы класса
Ответ Создать тему
Опции темы

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