1

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

  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. Как я поняла статические функции обращаются только к статическим функциям или можно каким то образом обойти?
Harry
  • 221,325

1 Answers1

4

Потому что пока ваша функция - член класса, она имеет не тип 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)();
}

};

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

Harry
  • 221,325