![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| GKosh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 27.12.2005 Репутация: нет Всего: нет |
Вот ситуация
class CMember; class CObject { CMember m_member; }; void main() { CObject object(); CMember* pointer = &(object.m_member); // pointer указывает на член класса m_member object.m_member = CMember(); // записываем в m_member новый экземпляр // *pointer - на что он теперь указывает? } Указатель на член класса действителен только пока я не инициализирую член новым экземпляром, после этого указатель указывает уже совсем не туда же, куда object.m_member. Как же мне получить долгоживущий указатель на член класса? , чтобы и после m_member = CMember();, *pointer выдавал реальное содержание m_member? P.S. class CObject { CMember* m_member; }; CMember** pointer = &(object.m_member); Такой вариант не годится. |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
С чего бы это? Содержимое объекта, конечно, изменилось, а адрес никуда не денется, пока жив внешний объект. -------------------- ... |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
ты же меняешь только внутреннее состояние m_member
|<><><><>||<><>...<><>||<><><>| между | и | - память для CObject между || и || - память для поля m_member в CObject жирный <> это адрес первого байта m_member, который ты присваиваешь указателю соответственно пока жив объект CObject указатель всегда указывает на верный объект, содержимое которого может меняться -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| GKosh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 27.12.2005 Репутация: нет Всего: нет |
Mayk,
Интересный код, который я к сожалению пока не могу понять, если вас не затруднит, я задам еще несколько вопросов: Почему struct CObject ? Или это не принципиально? CMember (CObject::*pointer) = ... Это объявление переменной? Какой тип имеет pointer? ...= &CObject::m_member На что указывает pointer? Пока ни на что? object1.*pointer = object2.*pointer; Откуда в классе CObject поле pointer? Зачем вообще нужна эта строчка? Earnest, Возникли трудности с этим моментом, указатель на поле данных класса (если поле данных - объект) оставался действительным лишь до тех пор, пока не проходило строчки наподобии object.m_member = CMember(); Тогда я решил, что object.m_member - своего рода смещение в заголовке класса, а не указатель как можно было бы предположить, таким образом CMember* pointer = &(object.m_member) на самом деле берет всего лишь адресс экземпляра класса, в данный момент завязанного на m_member, и если этот экземпляр заменить другим, то pointer на действительное содержание m_member указывать уже не будет. |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Потому что иначе мы не может обратиться к m_member'у из main()'а. Члены класса по умолчанию закрыты, члены структуры - открыты. Попросту говоря без struct'а код не компилировался. Да. Это указатель на член класса. То есть то, что просилось в сабже и в окрестностях Долгоживущее некуда. CObject *obj = new CObject; obj->*pointer - суть obj->m_member delete obj; obj = new CObject; obj->*pointer - опять obj->m_member, а не что-то другое На m_member в CObject'е. В любом CObject'е вообще а не в каком-то конкретно.
Ниоткуда. pointer - это указатель на член класса, а не член класса. object1.*pointer в данном случае это object1.m_member (так как object1 - это object1, а pointer - это -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| GKosh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 27.12.2005 Репутация: нет Всего: нет |
Mayk,
Хорошо, а если мне необходимо в экземпляре стороннего класса хранить указатель на поле m_member конкретного экземпляра CObject? |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
для работы c полем a конкретного экземпляра A передпншь в свой сторонний класс (здесь someclass) указатель либо ссылку на A и используешь
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| LPBOY |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Что значит "указатель на поле m_member конкретного экземпляра CObject"? На самом деле указатель на какое-либо поле - это просто смещение в байтах его относительно начала класса. Для всех экземпляров класса CObject это смещение будет одним и тем же. Добавлено @ 12:17 И что за привычка у всех ставить скобки при объявлении указателя
--------------------
Каждый человек по-своему прав, а по-моему нет... |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |