Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Указатели на поля класса

Читайте также:
  1. Ii) Указатели на элементы массива
  2. Б) элементы системы вне зависимости от ее класса образуют устойчивые достаточно сильные взаимосвязи
  3. Бронирование в разных классах
  4. В: Что уже известно об игровых классах?
  5. ГЛАВА 6: ОСНОВЫ СТИЛЯ И КЛАССА, А ТАКЖЕ БОЛЕЕ О ТОМ, КАК ОЧАРОВАТЬ ЖЕНЩИНУ
  6. Данные роста и состояния здоровья учащихся 11 Г класса 51 школы
  7. Данные роста и состояния здоровья учащихся 11 Д класса 51 школы

 

Можно определить указатель на поле класса. Указатель копирует (имитирует) поведение 'переменной-члена', обращаясь с различными членами как со 'значением' этой переменной. Указатель на поле должен использоваться при помощи объекта класса. (Указатель может указывать как на статические, так и не статические члены. Т.к., указатели на статические члены используются редко, то мы здесь обсудим только указатели на не статические поля.) Разыменовывая (разадресуя) указатель мы получаем доступ к конкретному члену объекта.

 

Объявление:

 

typeT ClassX::*dmptr;

// указатель на члены класса ClassX, имеющие тип typeT

 

Или с применением директивы typedef:

 

typedef typeT ClassX::* dmptr_type; // dmptr_type – тип-синоним

dmptr_type dmptr;

 

Этот указатель может указывать на любой член класса ClassX, имеющий тип typeT. Пусть x – некоторый объект класса ClassX. Некоторого члена a можно достичь с помощью указателя dmptr таким образом:

 

dmptr = &ClassX:: a;

 

Значение указателя на поле a, в данном случае, не является реальным адресом (поля без какого-либо объекта не имеют адресов), а является относительным адресом поля, отсчитываемым от первого байта предполагаемого объекта. Поэтому, указатель на член класса обычно называется указателем-смещением (offset pointer). Когда dmptr указывает на член a, нотация x.*dmptr эквивалентна x.a, и, если p есть указатель на объект класса ClassX, то запись p ->*dmptr эквивалентна p -> a. (Заметим, что между -> и * не должно быть пробела).

 

Пример 10-4.1 В этом примере выполняется сортировка массива объектов класса Point по методу “пузырька”. Сортировка может быть произведена по первой или второй координате.

Пояснение. Для сортировки n -элементного массива методом пузырька требуется до n-1 проходов. В каждом проходе сравниваются соседние элементы, и если первый из них “больше” второго, то эти элементы меняются местами. К моменту окончания каждого прохода наибольший элемент “поднимается” ближе к началу массива, подобно пузырьку воздуха в кипящей воде.

 

#include <iostream.h>

 

class Point

{

float x;

float y;

public:

Point(float i = 0, float j = 0): x(i), y(j) { }

void print() const

{cout << "(" << x << ", " << y << ")";}

static void set_ptr(char c, float Point::*& dmptr)

{ dmptr = (c == 'x'? &x: &y); }

};

 

int main()

{

void print_array(Point *, int);

void b_sort(Point * an_array, int n, float Point::* coordinate);

Point point_array[3] = {Point(3, 3), Point(2, 1), Point(1, 2)};

char c;

float Point::*dmptr;

 

cout << "Sort by x or y? x/y\n";

cin >> c;

Point::set_ptr(c, dmptr);

// указание на x или y, динамически

print_array(point_array, 3);

b_sort(point_array, 3, dmptr);

cout << "The sorted array is:\n";

print_array(point_array, 3);

return 0;

}

 

void print_array(Point * a, int n)

{

a[0].print();

for (int i = 1; i < n; ++i)

{

cout << ", ";

a[i].print();

}

cout << endl;

}

 

void b_sort(Point *a, int n, float Point::* dmptr)

{

Point temp;

for (int i = n; i > 1; --i)

for (int j = 0; j < i - 1; ++j)

if (a[j].*dmptr > a[j + 1].*dmptr) // a[ ].x или a[ ].y

{

temp = a[j];

a[j] = a[j + 1];

a[j + 1] = temp;

}

}

 


Дата добавления: 2015-11-16; просмотров: 81 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Дружественные классы и дружественные функции (friend).| C 4 redo группами по 2 файла, 2 control-файлами, табличным пространством system, имеющим 2 файла данных по 50 мб

mybiblioteka.su - 2015-2024 год. (0.007 сек.)