Проблема с указателем на функцию-член c ++ - PullRequest
8 голосов
/ 07 июня 2011

Я новичок в C ++. Я хочу знать об объектном указателе и указателе на функцию-член. Я написал код, который выглядит следующим образом:

код:

#include <iostream>
using namespace std;
class golu
{
   int i;
public:
   void man()
   {
      cout<<"\ntry to learn \n";
   }
};
int main()
{
   golu m, *n;
   void golu:: *t =&golu::man(); //making pointer to member function

   n=&m;//confused is it object pointer
   n->*t();
}

, но когда я компилирую его, он показывает мне две ошибки:

pcc.cpp: In function ‘int main()’:
pcc.cpp:15: error: cannot declare pointer to ‘void’ member
pcc.cpp:15: error: cannot call member function ‘void golu::man()’ without object
pcc.cpp:18: error: ‘t’ cannot be used as a function.

мой вопрос следующий:

  1. Что я делаю не так в этом коде?
  2. Как сделать указатель на объект?
  3. Как сделать указатель на функцию-член класса и как их использовать?

Пожалуйста, объясните мне эту концепцию.

Ответы [ 4 ]

8 голосов
/ 07 июня 2011

Здесь исправлено две ошибки:

int main()
{
   golu m, *n;
   void (golu::*t)() =&golu::man; 

   n=&m;
   (n->*t)();
}
  1. вы хотите указатель на функцию
  2. приоритет операторов не тот, который вы ожидали, мне пришлось добавить скобки. n->*t(); интерпретируется как (n->*(t())), а вы хотите (n->*t)();
4 голосов
/ 07 июня 2011

Указатель на функцию-член имеет следующую форму:

R (C::*Name)(Args...)

Где R - это тип возвращаемого значения, C - это тип класса, а Args... - любые возможные параметры функции (или нет).

С этим знанием ваш указатель должен выглядеть так:

void (golu::*t)() = &golu::man;

Обратите внимание на пропущенный () после функции-члена. Это попыталось бы вызвать указатель на функцию-член, который вы только что получили, и это невозможно без объекта.
Теперь это становится намного более читабельным благодаря простому typedef:

typedef void (golu::*golu_memfun)();
golu_memfun t = &golu::man;

Наконец, вам не нужен указатель на объект для использования функций-членов, но вам нужна скобка:

golu m;
typedef void (golu::*golu_memfun)();
golu_memfun t = &golu::man;
(m.*t)();

Скобки важны, потому что оператор () (вызов функции) имеет более высокий приоритет (также называемый приоритет ), чем оператор .*->*).

2 голосов
/ 07 июня 2011

'void golu :: * t = & golu :: man ();'должно быть изменено на 'void (golu :: * t) () = & golu :: man;'Вы пытаетесь использовать указатель на функцию, а не указатель на результат статической функции!

1 голос
/ 07 июня 2011

(1) Указатель на функцию объявлен неправильно.

(2) Вы должны заявить так:

void (golu::*t) () = &golu::man;

(3) Указатель на функцию-член должен использоваться с объектом class.

...