Для чего указатели должны классифицировать участников, используемых?

Я читал об указателях на участников класса, но я никогда не видел, что они используются в любом практическом применении. Кто-то может объяснить, каковы варианты использования таких указателей? Действительно необходимо иметь такие указатели?

Например.

class abc
{
public:
    int a;
    abc(int val) { a = val; }
};

 int main()
{
   int abc::*data;
   abc obj(5);

   data = &abc::a;

   cout << "Value of a is " << obj.*data << endl;

   return 0;
}

В вышеупомянутом, например, почему имеет значение полученный доступ этим способом? Каково преимущество использования указателей на участников класса?

7
задан srikfreak 6 May 2010 в 05:06
поделиться

4 ответа

Самым большим преимуществом функции указателя на член или указателя на член является то, что вам

  • не нужно связывать к конкретному экземпляру сразу
  • не нужно накладывать никаких ограничений на имена членов, должен соответствовать только тип.

Это можно использовать, например, для обратные вызовы или абстрактные алгоритмы:

std::map<int,int> m;
m.insert(std::make_pair(1,2));
m.insert(std::make_pair(3,4));
m.insert(std::make_pair(5,6));
std::ptrdiff_t s = 
    std::count_if(m.begin(), m.end(),
                  boost::bind(&std::map<int,int>::value_type::first, _1) > 2);
std::cout << s << std::endl; // 2

Обратите внимание, что Boost.Bind, Boost.Function и их эквиваленты TR1 уже прекрасно инкапсулируют это для вас. В определенной степени текущий стандарт также включает такие инструменты, как std :: mem_fun в .

9
ответ дан 6 December 2019 в 23:02
поделиться

Вопрос, я полагаю, заключается в следующем: "что добавляет указатель на данные-члены по сравнению с простым указателем на данные?", и единственный ответ, который я могу придумать, это уровень явного значения: мы указываем на данные в классе this.

Теперь я вижу некоторую ценность в том, что фактически является дополнительным документированием намерения. Один из примеров, который я видел, может быть весьма эффективным, когда наш "класс" на самом деле является унаследованной структурой языка C. Теперь у нас нет локальных методов этой структуры, поэтому наличие некоторых указателей, явно связанных с этой структурой, может сделать наш код более понятным.

0
ответ дан 6 December 2019 в 23:02
поделиться

Указатель на член, как и все функции C ++, просто синтаксический сахар для того, что вы уже могли сделали на чистом C.

Указатели на переменные-члены довольно просты. Один из вариантов использования - если вы хотите написать (шаблонную) функцию, которая могла бы сортировать массив структур по любому полю. Передав указатель на член, вы можете получить некоторое указанное поле любого экземпляра структуры без необходимости жесткого кодирования поля. Конечно, вместо него можно было бы использовать функтор, который принимает указатель на структуру и возвращает значение поля.

Указатели на функции-члены немного сложнее. На первый взгляд, они похожи на обычные указатели на функции, которые умеют передавать скрытый указатель this. Но виртуальные функции делают простую идею довольно сложной.

А виртуальные базовые классы ужасно усложняют все указатели на член. Это не то, что вы хотели бы кодировать самостоятельно, используя простые конструкции C. Но сложные случаи редки.

0
ответ дан 6 December 2019 в 23:02
поделиться

Если вы пользовались MFC, вы увидите, что указатели на концепцию функции-члена активно используются (внутри)

DECLARE_MESSAGE_MAP, BEGIN_MESSAGE_MAP, END_MESSAGE_MAP См. Карты сообщений

2
ответ дан 6 December 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: