【问题标题】:Calling Member function pointers from vector list从向量列表中调用成员函数指针
【发布时间】:2013-10-11 00:34:15
【问题描述】:

我是函数指针的新手,我写了一个小程序,其中主类使用 Test 类来填充成员函数指针的列表。从我的主类中,我想调用 ExeFuns() 来调用每个成员函数,我不知道该怎么做。任何帮助是极大的赞赏。谢谢。

Test.h

Class Test{
  public : 
   void CallFun1(); 
   void CallFun2();

   void AddFuns(); 
   void ExeFuns();      
}; 

Test.cpp

std::vector<void (Test::*) ()> callist; 


void Test::AddFuns(){
  callist.push_back(&Test::CallFun1); 
  callist.push_back(&Test::CallFun2); 
}


void Test::ExeFuns(){
  for (int i = 0 ; i<eventlist.size(); i++)
  {
   callist[i](); // error!
  }
}

void Test::CallFun1(){ cout<<"Fun 1"<<endl; }
void Test::CallFun2(){ cout<<"Fun 2"<<endl; }

Main.cpp

main()
{
Test obj; 
obj.AddFuns(); 
obj.ExeFuns(); 
}

【问题讨论】:

  • 你需要一个对象来调用它们。
  • 如果你有一个兼容 C++11 的编译器(现在几乎都是),那么你可能想看看 std::functionstd::bind。如果你没有 C++11,那么 Boost.FunctionBoost.Bind 也一样。
  • 哦,您的 ExeFuns 循环中有一个错误。

标签: c++


【解决方案1】:

简而言之,您需要 .* 或 -> 运算符来调用成员方法。 此外,您的代码中有几个编译错误和一个越界访问。 这是正确的做法,

void Test::ExeFuns(){
  for (int i = 0 ; i<callist.size(); i++) // also there is out of bounds access (usage of <=) in your code
  {
    (this->*callist[i])(); // or (*this.*callist[i])();
  }
}

【讨论】:

  • 感谢您的 cmets。如果我使用 vector::pop_back(),我将如何获得相同的结果?
  • pop_back 不返回任何值,因此您不能使用它来调用该方法,但您仍然可以使用 vector::back() as (this->*callist.back() )();
【解决方案2】:

这些不是指向独立函数的指针,它们是指向类的成员函数的指针。正如克里斯所说,您需要一个对象来调用它们。

检查this SO 问题。

【讨论】:

    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 2013-01-26
    • 2013-10-13
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2010-12-28
    • 2023-03-28
    相关资源
    最近更新 更多