Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель на член класса 
:(
    Опции темы
GKosh
Дата 17.2.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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);

Такой вариант не годится.
PM MAIL   Вверх
Mayk
Дата 17.2.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Код

class CMember{};

struct CObject
{
     CMember m_member;
};

int main()
{
   CObject object1;
   CObject object2;

   CMember (CObject::*pointer) = &CObject::m_member;
   object1.*pointer = object2.*pointer;
}




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 17.2.2006, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(GKosh @ 17.2.2006, 18:10 Найти цитируемый пост)
Указатель на член класса действителен только пока я не инициализирую член новым экземпляром, после этого указатель указывает уже совсем не туда же, куда object.m_member.

С чего бы это? Содержимое объекта, конечно, изменилось, а адрес никуда не денется, пока жив внешний объект.



--------------------
...
PM   Вверх
MAKCim
Дата 17.2.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



ты же меняешь только внутреннее состояние m_member
|<><><><>||<><>...<><>||<><><>|
между | и | - память для CObject
между || и || - память для поля m_member в CObject
жирный <> это адрес первого байта m_member, который ты присваиваешь указателю
соответственно пока жив объект CObject указатель всегда указывает на верный объект, содержимое которого может меняться


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GKosh
Дата 18.2.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 указывать уже не будет.

PM MAIL   Вверх
Mayk
Дата 18.2.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(GKosh @ 18.2.2006, 12:34 Найти цитируемый пост)
Почему struct CObject ? Или это не принципиально?

Потому что иначе мы не может обратиться к m_member'у из main()'а. Члены класса по умолчанию закрыты, члены структуры - открыты. Попросту говоря без struct'а код не компилировался.
Цитата(GKosh @ 18.2.2006, 12:34 Найти цитируемый пост)

CMember (CObject::*pointer) = ...

Это объявление переменной?

Да.

Цитата(GKosh @ 18.2.2006, 12:34 Найти цитируемый пост)
Какой тип имеет pointer?

Это указатель на член класса. То есть то, что просилось в сабже и в окрестностях
Цитата(GKosh @ 17.2.2006, 22:10 Найти цитируемый пост)
Как же мне получить долгоживущий указатель на член класса

Долгоживущее некуда.
CObject *obj = new CObject;
obj->*pointer - суть obj->m_member
delete obj;
obj = new CObject;
obj->*pointer - опять obj->m_member, а не что-то другое

Цитата(GKosh @ 18.2.2006, 12:34 Найти цитируемый пост)
На что указывает pointer? Пока ни на что?

На m_member в CObject'е. В любом CObject'е вообще а не в каком-то конкретно.

Цитата(GKosh @ 18.2.2006, 12:34 Найти цитируемый пост)

object1.*pointer = object2.*pointer;
Откуда в классе CObject поле pointer?

Ниоткуда. pointer - это указатель на член класса, а не член класса.
object1.*pointer в данном случае это object1.m_member
(так как object1 - это object1, а pointer - это
Цитата(Mayk @ 17.2.2006, 22:23 Найти цитируемый пост)
&CObject::m_member;




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
GKosh
Дата 19.2.2006, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 27.12.2005

Репутация: нет
Всего: нет



Mayk,
Хорошо, а если мне необходимо в экземпляре стороннего класса хранить указатель на поле m_member конкретного экземпляра CObject?
PM MAIL   Вверх
MAKCim
Дата 19.2.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

template<class R, class C> struct member_ptr
{
    typedef R (C::*type); 
};

class A
{
public:
    int a;
};

class someclass
{
private:
    typedef member_ptr<int,A>::type T;
    T pointer;
public:
    someclass(T ptr): pointer(ptr) {}
};

для работы c полем a конкретного экземпляра A передпншь в свой сторонний класс (здесь someclass) указатель либо ссылку на A и используешь
Код

(ptr->*pointer)=...
(ref.*pointer)=...



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
LPBOY
Дата 19.2.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(GKosh @ 19.2.2006, 10:04 Найти цитируемый пост)
Хорошо, а если мне необходимо в экземпляре стороннего класса хранить указатель на поле m_member конкретного экземпляра CObject?


Что значит "указатель на поле m_member конкретного экземпляра CObject"? На самом деле указатель на какое-либо поле - это просто смещение в байтах его относительно начала класса. Для всех экземпляров класса CObject это смещение будет одним и тем же.
Добавлено @ 12:17
И что за привычка у всех ставить скобки при объявлении указателя smile
Код

typedef R (C::*type);

--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.