Я хочу определить контейнер в базовом классе, который содержит функцию obj или что-то еще, что может реализовать мою цель. Эти функции obj могут вызывать функции производных классов. все они принимают одинаковые параметры.
#include <vector>
#include <functional>
#include <iostream>
class Foo {
Foo() {}
virtual ~Foo(){}
virtual void init()
{ registerCallback(0, &Foo::print_ori ); }
void print_ori(int i) const { std::cout << i << '\n'; }
void registerCallback(int key, ??? cb ) // NOT SURE HOW TO DEFINE THIS
{
callbacks[key] = cb;
}
void runCallbacks(int key, int n)
{
auto i = callbacks.find(key);
if (i != callbacks.end()) {
(*i)(*this, n);
}
}
std::map<int, std::function<void(const Foo&, int) > > callbacks; // obviously, it's wrong. how to fix it?
};
struct Foo2 : public Foo {
Foo2(int num) : Foo(num) {}
virtual void init()
{
Foo::init();
registerCallback(11, &Foo2::print1 );
registerCallback(12, &Foo2::print2 );
}
void print1(int i) const { std::cout << " - Foo2.p1 - " << i << endl; }
void print2(int i) const { std::cout << " - Foo2.p2 - " << i << endl; }
};
int main()
{
Foo* obj = new Foo2();
obj->init();
obj->runCallbacks(12, 456);
}
UB
, когда передаетеfobj
типаFoo
вprint_ttt
и, таким образом, используетеvtable
типаFoo
для вызова функции, которая находится только вFoo2
. - person Mats Petersson   schedule 07.08.2013Foo
(и производных) ссылок и вызывать одну и ту же виртуальную функцию для каждого объекта? Возможно, ваш пример слишком прост для того, что вы ДЕЙСТВИТЕЛЬНО хотите сделать, но похоже, что вы должны это сделать. - person Mats Petersson   schedule 07.08.2013virtual
?], то что-то не так. Весь смысл наследования и виртуальных функций заключается в том, чтобы избежать указателей на функции и переложить ответственность за знание того, какие функции запускать на уровне - или что-то в этом роде. Я напишу ответ на этот счет, если вам это не нравится, пожалуйста, так и скажите... - person Mats Petersson   schedule 07.08.2013base_ptr->runCallbacks()
. количество обратных вызовов может быть десятками. - person doufunao   schedule 07.08.2013