Ошибка при вызове указателя на функцию-член

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

//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)) ===|

Сделайте более простые примеры, чтобы поиграть с новым синтаксисом. И попробуйте указатель на член данных перед указателем на член функции.

John 13.06.2019 15:13

указатели на функции - это беспорядок для объявления, если вы не используете псевдоним, как в using void_func = void (A::*) (void); Должен признать, я действительно не понимаю, как вы используете эту test структуру

463035818_is_not_a_number 13.06.2019 15:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Просто хочу отметить, что порядок вызова здесь obj->*(obj->t.fptr), а не (obj->*obj)->t.fptr, на случай, если кто-то еще запутается, как я. :)

SilvanoCerza 13.06.2019 15:27

А obj->*&A::display эквивалентно obj->*obj->t.fptr.

SilvanoCerza 13.06.2019 15:29

Верно, но я думаю, что идея ОП заключалась в том, чтобы использовать промежуточное звено struct test для дальнейшего косвенного указания указателя на член.

lubgr 13.06.2019 15:32

Большое спасибо @SilvanoCerza. Это прекрасно работает. Одна вещь, которая меня смутила, это то, почему нам нужно использовать obj два раза, чтобы вызвать указатель на функцию-член?

Selva 14.06.2019 08:39

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