Для чего используются указатели на учеников? - PullRequest
7 голосов
/ 06 мая 2010

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

Например.

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;
}

В приведенном выше примере. почему к значению «а» обращаются таким образом? В чем преимущество использования указателей для учеников?

Ответы [ 4 ]

9 голосов
/ 06 мая 2010

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

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

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

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 в <functional>.

2 голосов
/ 06 мая 2010

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

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

0 голосов
/ 06 мая 2010

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

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

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

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

0 голосов
/ 06 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...