Похоже, ваш вопрос касается указателей типа указателя на data -member. В C ++ также есть указатели типа указатель на член- function . У обоих есть что-то общее на каком-то абстрактном уровне, но в остальном они разные.
Указатель типа указатель на элемент-член данных применим к любому экземпляру класса. Обычный указатель всегда указывает на член конкретного экземпляра класса. Указатель типа указатель на элемент-член является реализацией более высокого уровня идеи «смещения во время выполнения» от начала объекта класса. Это относительный указатель. Таким образом, это совершенно отличная вещь от обычных указателей, которые являются абсолютными указателями.
Чтобы проиллюстрировать это на примере, скажем, у вас есть массив классов с тремя членами одного типа x
, y
и z
struct Point { int x, y, z; };
Point point_array[N];
и вам нужно установить для всех элементов с одинаковым именем значение 0
во всем массиве, не меняя других членов. Вот как вы можете сделать это, используя указатель типа указатель на элемент-член
void zero_members(Point points[], int n, int Point::*m) {
for (int i = 0; i < n; ++i)
points[i].*m = 0;
}
Теперь с помощью этой функции вы можете сделать
zero_members(point_array, N, &Point::x);
для установки всех x
с на ноль. Или вы можете сделать
zero_members(point_array, N, &Point::y);
для установки всех y
на ноль. Все это можно сделать с помощью функции single , и, что также важно, выбор элемента выполняется параметром run-time (в отличие от время компиляции один).
Вы не можете делать что-то подобное с обычными указателями. На самом деле, вы не можете сделать это по-другому.