Читайте также:
|
|
Можно определить указатель на поле класса. Указатель копирует (имитирует) поведение 'переменной-члена', обращаясь с различными членами как со 'значением' этой переменной. Указатель на поле должен использоваться при помощи объекта класса. (Указатель может указывать как на статические, так и не статические члены. Т.к., указатели на статические члены используются редко, то мы здесь обсудим только указатели на не статические поля.) Разыменовывая (разадресуя) указатель мы получаем доступ к конкретному члену объекта.
Объявление:
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 мб |