Передать адрес метода объекта другому объекту для его вызова - PullRequest
0 голосов
/ 07 мая 2020

Привет, я использую C ++, и я хотел бы передать метод одного объекта другому объекту того же класса:

class Object{
public:
    int id;
    int newId;
    Object(int _id){
       id = _id;
    };
    int (*function)();
    int someFunction(){
       return id*2;
    };
    void updateFunction(){
       newId = function();
    }
};

int someOtherFuntion(){
   return 3;
}

int main(){

    Object* obj[2];
    obj[0] = new Object(1);
    obj[1] = new Object(2);
    //next line is where the error happens
    obj[0]->function = &obj[1]->someFunction;
    obj[1]->function = &someOtherFuntion;

    for(int i = 0; i<2; i++){
       obj[i]->updateFunction();
    }
    return 1;
}

Позже я хочу перебрать все объекты с помощью al oop, и вызвать соответствующую функцию, иногда метод объекта, а иногда и обычную функцию.

Это возвращает ошибку: ISO C ++ запрещает использование адреса связанной функции-члена для формирования указателя на функцию-член. Скажите '& Object :: someFunction' [-fpermissive]

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Невозможно обойтись с указателями на функции, потому что методы не могут быть назначены указателям на функции. Но вы можете делать все, что хотите, с помощью std::function, который намного более гибок, чем указатель на функцию, и с помощью лямбда-функции для привязки вашего метода к определенному объекту,

#include <functional>

class Object{
public:
    int id;
    int newId;
    Object(int _id){
       id = _id;
    };
    std::function<int()> function; // function is an int function with no parameters
    int someFunction(){
       return id*2;
    };
    void updateFunction(){
       newId = function();
    }
};

int someOtherFuntion(){
   return 3;
}

int main(){

    Object* obj[2];
    obj[0] = new Object(1);
    obj[1] = new Object(2);
    obj[0]->function = [=](){ return obj[1]->function(); }; // make a lambda function to bind function to obj[1]
    obj[1]->function = someOtherFuntion;

    for(int i = 0; i<2; i++){
       obj[i]->updateFunction();
    }
    return 1;
}
1 голос
/ 07 мая 2020

вызовет ли это obj2 и его метод?

Нет. Программа имеет неправильный формат.

или копия метода obj2?

Функции не могут быть скопированы.

обратите внимание Я не хочу использовать typedef, потому что я использую микроконтроллер

Я не вижу никакой связи между этими двумя вещами.

Я хотел бы передать метод одного объекта в другой объект того же класса

Функции-члены - это то, что одинаково для всех экземпляров одного и того же класса. Их адрес не отличается от одного объекта к другому.

Судя по примеру, похоже, что вы хотите привязать аргумент объекта функции-члена. Для этого вы можете использовать объект функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...