2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183

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

11.09.2012, 18:57. Показов 7631. Ответов 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

И вообще для чего нужны эти указатели, что на методы класса, что на обычные функции?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.09.2012, 18:57
Ответы с готовыми решениями:

Указатели и элементы класса
Суть проблемы: есть класс neuro. в нём есть элемент данных double *inputs; // входыесть независимый от первого класс auction в нём...

Указатели на метод класса
Допустим есть 2 класса: class A { public: A() {} ~A() {} virtual void Draw(GLuint shader)

Указатели на объекты класса
Здравствуйте. помогите новичку. есть проблема с освоением программирования на VC++. пытаюсь скомпилировать вот этот пример из книги: ...

22
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.09.2012, 16:56
Студворк — интернет-сервис помощи студентам
Что за смещение? Если Вы говорите о доступе к виртуальным методам, то при компиляции класса содержащего виртуальную функцию ( -ции ) создается таблица виртуальных функций. Фактически каждый объект класса содержит указатель на данную таблицу для своего класса. При обращении через указатель базового класса, указатель разыменовывается, и мы получаем объект производного ( или того же базового класса ). Указатель на таблицу ( vtable ) находится в начале объекта, то есть объект с него начинается. Далее просто берется этот указатель, и разыменовывается. И так мы попадаем непосредственно к vtable, все что остается программе - это сделать смещение, если потребуется ( если виртуальных функций несколько, и требуется не первая в таблице функция ), на некое количество байт ( количество кратно размеру указателя системы ) , и разыменовать полученный адрес, что бы получить доступ к самой функции.
0
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
12.09.2012, 17:45  [ТС]
а обычные функции в vtable не записываются? А то в примерах в инете, приводятся обычно примеры классов содержащих одну вирт функцию и обычную и рисуют вирт. табл. где и обычная функция и вирт. функция находятся...А поля класса где сохр?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.09.2012, 18:03
Обычные функции не записываются, для них происходит статическое связывание на этапе компиляции. Я описал лишь один из возможных, и самых частых реализаций полиморфизма. Стандартом языка не оговорена его реализация.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2012, 18:03

Указатели на члены класса
Здравствуйте, В коде при вызове функции print() из CL2 вызывается print() из CL1. Подскажите, где грабли. Заранее спасибо. ...

Конструкторы и указатели на объект класса
Добрый вечер. Помогите, пожалуйста, прояснить 2 вещи: 1) В чём будет отличие между конструкторами: int a; //Исп. оператор...

ООП - Указатели на функции члены класса
Не пойму в чем ошибка, MVS2017 при компиляции выдает целую стопку ошибок: #include <iostream> using namespace std ...

Потоки и указатели (в поток вставить объект класса)
Есть структура: class shapka{ public: int* prev; int n; int* next; } }; Нужно в поток вставить объект класса, потом...

Как на практике используются указатели на члены класса
Вопрос №3. А как на практике используются указатели на члены класса? Они в реальном коде вообще используется? Приведите пример когда они...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Опции темы

Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru