Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Вектор указателей на виртуальные функции

#cpp #указатели


Здравствуйте! Возможно ли создать вектор указателей на виртуальные функции базового
класса, чтобы вызывать их в цикле для каждого из объектов дочерних классов? Есть ошибочный
пример, не могли бы Вы объяснить, где я допустил оплошность? Заранее благодарен!

 class Parent {
    public:
       virtual void func1()=0;  
       virtual void func2()=0;
 };

 class Child : public Parent{
    public:                 
       void func1(){//do something1}
       void func2(){//do something2}

 class SomeClass{
    public:
       std::vector vec;
       typedef  void (Parent::*ptr)();
       std::vector unit;
       SomeClass{
          vec.push_back(&obj1);
          vec.push_back(&obj2);
          ptr func1=&Parent::func1;
          ptr func2=&Parent::func2;
          unit.push_back(func1);
          unit.push_back(func2);
        }
 Child obj1;
 Child obj2;
 void genfunc();                                                                
 };

    void SomeClass::genfunc(){
       for(size_t q=0;  q< unit.size();q++){
          for(size_t i = 0; i < vec.size(); i++){
             vec[i]->unit[q]();
          }
       }
    }   

    


Ответы

Ответ 1



Вызов метода по указателю производится с использованием странного оператора ->*. У меня вот так работает (MSVC 2015): class Parent { public: virtual void func1() = 0; virtual void func2() = 0; }; class Child : public Parent { public: Child(int n) : n(n) {} void func1() { cout << "Child::func1/" << n << endl; } void func2() { cout << "Child::func2/" << n << endl; } int n; }; class SomeClass { public: std::vector vec; typedef void (Parent::*ptr)(); std::vector unit; SomeClass(): obj1(1), obj2(2) { vec.push_back(&obj1); vec.push_back(&obj2); ptr func1 = &Parent::func1; ptr func2 = &Parent::func2; unit.push_back(func1); unit.push_back(func2); } Child obj1; Child obj2; void genfunc() { for (size_t q = 0; q < unit.size(); q++) { for (size_t i = 0; i < vec.size(); i++) { (vec[i]->*unit[q])(); } } } }; int main() { SomeClass sc; sc.genfunc(); } Обновление: C++ FAQ рекомендует не заморачиваться с синтаксисом, а использовать std::invoke: void genfunc() { for (size_t q = 0; q < unit.size();q++) { for (size_t i = 0; i < vec.size(); i++) { std::invoke(unit[q], vec[i]); } } }

Комментариев нет:

Отправить комментарий