Проблема с указателем на функцию-член C++

Я новичок в 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 ответа

Решение

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

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

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

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

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)();

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

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

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

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

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

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

Другие вопросы по тегам