#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";
}
Указатель на класс?
Вот отрывок из курса Intuit.ru(наткнулся на него когда искал ответ на вопрос можно ли задать указатель на класс. Не на обьект класса!!! ):
Цитата:
Переменная, объявленная как указатель на класс, применяется для доступа к методам и переменным членам класса. В следующей таблице приведен синтаксис, используемый при работе с указателями на члены класса.
Hапример:
Код:
Я как-то не совсем понял зачем нужна подобная конструкция
Код:
int A::*pToj = &A::j1;
и чем лучше писать вот так
Код:
jA.*pToj = 123;
чем просто
Код:
jA.j1 = 123;
Я искал информацию по этому поводу в гугле(на форуме тож вроде ниче похожего нет:( ), но ничего не нашел(что и не странно, если учесть что я не знаю, даже, как это назвать :( )Если кто знает где можно почитать об этом механизме поподробнее, киньте пжалста ссылочку.
Заранее благодарю!
В общем вот мнение людей по этому поводу:
Потом можно произвольно обращаться по данному смещению к любому другому объекту. А можно, индексируя величину смещения - обращаться к другим полям (если они однотипные - иначе КУЧАГЛЮКОВ)
В общем, задумка состоит в обращении к полю с заранее неизвестным именем.
Хотя, такое вижу в первый раз. Куда чаще наблюдал использование указателей на методы класса (позволяет вызвать неизвестный метод)
Лучше использвать технику get-теров и set-теров.
Цитата:
Похоже, сдесь определяется адрес поля класса - смещение относительно начала объекта.
Я тоже пришел к такому выводу.
В общем пробовал получить указатель на поле определенного обьекта:
Код:
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);//ошибка
}
#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-теров.
Лучше использвать технику get-теров и set-теров.
Полностью за!!!