Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Указатель на класс?

10K
29 октября 2007 года
FAngel
77 / / 13.09.2006
Доброго времени суток!
Вот отрывок из курса Intuit.ru(наткнулся на него когда искал ответ на вопрос можно ли задать указатель на класс. Не на обьект класса!!! ):
Цитата:

Переменная, объявленная как указатель на класс, применяется для доступа к методам и переменным членам класса. В следующей таблице приведен синтаксис, используемый при работе с указателями на члены класса.

Hапример:
Код:
#include <iostream.h>
class A     // Объявление класса A
{ public: int j1;
   A(void);
   ~A(void);};
void main() {
int A::*pToj = &A::j1;
    // Объявление производного типа pToj
    // как указателя на член класса j1
A jA;                  
    // Объявление переменной объектного типа A
A *pjA = & jA;  
    // Объявление указателя на эту
    // переменную (объект)
int j;
jA.*pToj = 123;    
    // Присваивание значения переменной
    // jA::j1, используя *
j = pjA ->*pToj;
    // Получение значения, используя ->*
 std::cout << j << "\n";
}


Я как-то не совсем понял зачем нужна подобная конструкция

 
Код:
int A::*pToj = &A::j1;

и чем лучше писать вот так

 
Код:
jA.*pToj = 123;

чем просто

 
Код:
jA.j1 = 123;

Я искал информацию по этому поводу в гугле(на форуме тож вроде ниче похожего нет:( ), но ничего не нашел(что и не странно, если учесть что я не знаю, даже, как это назвать :( )Если кто знает где можно почитать об этом механизме поподробнее, киньте пжалста ссылочку.
Заранее благодарю!
10K
29 октября 2007 года
FAngel
77 / / 13.09.2006
В общем вот мнение людей по этому поводу:
http://rsdn.ru/forum/message/2710603.flat.aspx#2710603
Кому интересно, читайте.
309
30 октября 2007 года
el scorpio
1.1K / / 19.09.2006
Похоже, сдесь определяется адрес поля класса - смещение относительно начала объекта.
Потом можно произвольно обращаться по данному смещению к любому другому объекту. А можно, индексируя величину смещения - обращаться к другим полям (если они однотипные - иначе КУЧАГЛЮКОВ)
В общем, задумка состоит в обращении к полю с заранее неизвестным именем.

Хотя, такое вижу в первый раз. Куда чаще наблюдал использование указателей на методы класса (позволяет вызвать неизвестный метод)
5
30 октября 2007 года
hardcase
4.5K / / 09.08.2005
Обращение к полям чужого класса - ЗЛО.
Лучше использвать технику get-теров и set-теров.
10K
30 октября 2007 года
FAngel
77 / / 13.09.2006
Цитата:

Похоже, сдесь определяется адрес поля класса - смещение относительно начала объекта.


Я тоже пришел к такому выводу.
В общем пробовал получить указатель на поле определенного обьекта:

 
Код:
int* pint = jA.j1;//ошибка!!!

тоесть я так понял что это (int A::*pToj = &A::j1; ) просто возможность добавить указатель на поле класса(в общем, всерано только на открытый:) ), ну а по поводу индексирования, то тут ничего не получилось:
Код:
#include<conio.h>
#include<iostream.h>
#include<stdio.h>
class A
{
   int j3;
public:
   int j1,j2;
   A(void){}
   ~A(void){}
};

void main()
{
   int a = 1,b = 2,*pint = &a;
   int A::*pToj = &A::j1;
   A jA;
   A jB;
   pint = *jB.j1;
   jB.*pToj =124;
   A *pjA = &jB;
   int j;
   jA.*pToj = 123;
   j = pjA->*pToj;
   cout<<pint[1]<<"\n";//работает отлично(ток у меня для того чтобы попасть на b надо ставить -1 в индекс)
   j = pjA->pToj[1];//ошибка
   j = pjA->*(pToj+1);//ошибка
}

Зачем это все надо я так и не понял.
Хотел было предположить что это для доступа к полям разных экземпляров ч-з указатель, но всерано надо писать чтот типа
 
Код:
j = pjA->*pToj;

что равносильно
 
Код:
j = pjA->j1;//тоесть без указателя на класс или экземпляра *pToj не воспользоватся

в общем на мой взгляд вся эта лабуда совсем не нужна(ну мож и нужна, но в оооооч редких случаях, кто их придумает - покажите пожалста)
P.S.:
Цитата: hardcase
Обращение к полям чужого класса - ЗЛО.
Лучше использвать технику get-теров и set-теров.


Полностью за!!!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог