Я создал класс с функцией-членом и структурой, которая имеет указатель функции на функцию-член в качестве атрибута. Я инициализировал структуру адресом функции-члена. Затем я создал объект для этого класса в основной функции и вызвал указатель на функцию-член с помощью «(-> *)». Но это не удалось с ошибкой, указывающей, что «ошибка:« правый операнд »не был объявлен в этой области»
//Header
#ifndef A_H
#define A_H
class A
{
public:
typedef struct
{
void (A::*fptr) ();
}test;
test t;
public:
A();
virtual ~A();
void display();
protected:
private:
};
#endif // A_H
//A.cpp
#include "A.h"
#include <iostream>
using namespace std;
A::A()
{
t.fptr = &A::display;
}
A::~A()
{
//dtor
}
void A::display()
{
cout << "A::Display function invoked" << endl;
}
//Main
#include <iostream>
#include "A.h"
using namespace std;
int main()
{
cout << "Pointer to Member Function!" << endl;
A *obj = new A;
(obj->*t.fptr)();
return 0;
}
||=== Build: Debug in fptr (compiler: GNU GCC Compiler) ===| In function 'int main()':| error: 't' was not declared in this scope| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
указатели на функции - это беспорядок для объявления, если вы не используете псевдоним, как в using void_func = void (A::*) (void);
Должен признать, я действительно не понимаю, как вы используете эту test
структуру
Указатель на функции-члены всегда трудно получить правильно. Но ты почти у цели. Во-первых, измените вызов на
(obj->*obj->t.fptr)();
а затем подумайте еще раз, нужно ли вам В самом деле использовать простой указатель на члены, вложенные в структуру того же класса, на который вы указываете, или могут ли некоторые псевдонимы типов или другие подходы украсить вышеупомянутого монстра :)
Просто хочу отметить, что порядок вызова здесь obj->*(obj->t.fptr)
, а не (obj->*obj)->t.fptr
, на случай, если кто-то еще запутается, как я. :)
А obj->*&A::display
эквивалентно obj->*obj->t.fptr
.
Верно, но я думаю, что идея ОП заключалась в том, чтобы использовать промежуточное звено struct test
для дальнейшего косвенного указания указателя на член.
Большое спасибо @SilvanoCerza. Это прекрасно работает. Одна вещь, которая меня смутила, это то, почему нам нужно использовать obj два раза, чтобы вызвать указатель на функцию-член?
Сделайте более простые примеры, чтобы поиграть с новым синтаксисом. И попробуйте указатель на член данных перед указателем на член функции.