Проблема с указателем на функцию-член 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.
мой вопрос следующий:
- Что я делаю не так в этом коде?
- Как сделать указатель на объект?
- Как сделать указатель на функцию-член класса и как их использовать?
Пожалуйста, объясните мне эту концепцию.
4 ответа
Здесь исправлены две ошибки:
int main()
{
golu m, *n;
void (golu::*t)() =&golu::man;
n=&m;
(n->*t)();
}
- Вы хотите указатель на функцию
- приоритет операторов не тот, который вы ожидали, мне пришлось добавить скобки.
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
,