#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::vectorvec; 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::vectorvec; 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]); } } }
Комментариев нет:
Отправить комментарий