Ошибка при вызове указателя на функцию-член - PullRequest
2 голосов
/ 13 июня 2019

Я создал класс с функцией-членом и структурой, которая имеет указатель на функцию-член в качестве атрибута.Я инициализировал структуру с адресом функции-члена.Затем я создал объект для этого класса в функции main и вызвал указатель на функцию-член с помощью «(-> *)».Но произошел сбой с ошибкой, в которой говорилось, что «ошибка:« правильный операнд »не был объявлен в этой области»

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

|| === Сборка: отладка в fptr (компилятор: GNU GCCКомпилятор) === |В функции 'int main ()': |ошибка: 't' не было объявлено в этой области ||| === Сбой сборки: 1 ошибка (ов), 0 предупреждение (я) (0 минут, 1 секунда) === |

1 Ответ

1 голос
/ 13 июня 2019

Указатель на функции-члены всегда трудно понять правильно.Но ты почти там.Сначала измените вызов на

(obj->*obj->t.fptr)();

, а затем снова подумайте, нужно ли вам действительно идти с простым указателем на члены, вложенные в структуру того же самого класса, на который вы указываетеили могут ли псевдонимы типа или другие подходы украсить вышеуказанного монстра:)

...