如何使一个类能够调用其他类函数的数组?

时间:2011-01-17 09:34:01

标签: c++ oop boost

我们需要的是一个带有2个方法add()和call()的类。当我们创建一个类时,我们可以使用add()函数添加一个函数,我们希望在调用call()时使用params调用(伪代码)

new A;
new B;
A.add(B.function(int)) // B takes int as an argument
A.call(); // and call() would look like {int i; sendArrayOfSubscribers(i);}
//now we know that B.function was executed with param generated in A;

这样的结构在C ++中是否可行?

2 个答案:

答案 0 :(得分:3)

您的代码非常不清楚,但似乎您想要设置一系列任务,然后执行所有任务。

你可以使用boost :: function来创建每个函数,你可以拥有它们的集合(向量)。

然后调用每个函数。类似的东西:

typedef boost::function< void (void) > func_type;
std::vector< func_type > funcs;
// populate funcs, 
std::for_each( funcs.begin(), funcs.end(), boost::bind(&func_type::operator(),_1) );

应该有效。 (可能有一个更简单的构造)

你使用更多的boost :: binds来创建你的集合“funcs”。函数不必不带参数,它们可以像你需要的那样使用“int”。你在绑定时传递它,例如:

funcs.push_back( boost::bind( &B::function, b, i ) );

其中“b”是b的实例,i是作为int的参数。

答案 1 :(得分:2)

试试这个(我必须重命名do,它是C ++中的关键字):

#include <iostream>
#include <vector>

using namespace std ;

typedef void FuncInt (int) ;

class A {
public:
  void add (FuncInt* f) ;
  void call() ;  
private:
  vector<FuncInt*> FuncVec ;
} ;

void A::add (FuncInt* f) {
  FuncVec.push_back (f) ;
}

void A::call() {
  for (size_t i = 0 ; i < FuncVec.size() ; i++)
    FuncVec[i] (i) ;
}

static void f0 (int i) { cout << "f0(" << i << ")" << endl ; }
static void f1 (int i) { cout << "f1(" << i << ")" << endl ; }

int main() {
  A a ;
  a.add (f0) ;
  a.add (f1) ;
  a.call() ;
}