Semantic issue указатель на функцию

Разбираюсь с указателем на функцию и возникли вопросы.

  1. Почему компилятор ругается

    A();
    ~A();
    
    void boo();
    struct func {
            std::string function_name; /* function name */
            void(*p)();   /* pointer to the function */
        };
        func my_func[1] = {
            { "boo", boo }
    };
    }
    
    
    

если объявлять функцию boo статичной, ошибка исчезает.

  1. Как я поняла статические функции обращаются только к статическим функциям или можно каким то образом обойти?

Ответы (1 шт):

Автор решения: Harry

Потому что пока ваша функция - член класса, она имеет не тип void(*)(), а вовсе даже void(A::*)(). А это совсем-совсем другая история.

Нестатической функции передается скрытый параметр - ссылка на объект, для которого она вызывается.

class A
{
public:
    A() {};
    ~A(){};

    void boo(){};

    struct func {
        std::string function_name; /* function name */
        void(A::*p)();   /* pointer to the function */
    };
    func my_func[1] = {
        { "boo",&A::boo }
    };
};

Как вызвать? ну, например, так:

A a, b;
(a.*b.my_func[0].p)();

Вызов функции-члена, внесенной в первый элемент массива my_func объекта b, для объекта a.

На очередной вопрос:

class A
{
public:
    A() {};
    ~A(){};

    void boo(){ cout << "boo\n"; };

    struct func {
        std::string function_name; /* function name */
        void(A::*p)();   /* pointer to the function */
    };
    func my_func[1] = {
        { "boo",&A::boo }
    };

    void zoo()
    {
        (this->*my_func[0].p)();
    }
};

Что еще прикажете написать? Или заодно приехать и полы помыть?...

→ Ссылка