for_each在c++中的用法


#include <list>
#include <algorithm>
class Abstract
{
    //contains a pure virtual function
};
class Mock
{
public:
   Mock();
 ~Mock()
 {
    std::for_each(m_abs_list.begin(), m_abs_list.end(), my_func);    
 } 
 void my_func(Abstract *ele){delete ele;} 
private:
   std::list <Abstract *> m_abs_list;
};

基本上,我试图为m_abs_list中的每个Abstract对象调用析构函数。这可以很容易地通过for回路实现。但我试图在这种情况下使用for_each

编译错误:

/usr/include/c++/4.2/bits/stl_algo.h: In function '_Function std::for_each(_InputIterator, _InputIterator, _Function) [with _InputIterator = std::_List_iterator<Abstract *>, _Function = void (Mock::*)(Abstract *)]'
/usr/include/c++/4.2/bits/stl_algo.h:159: error: must use '.*' or '->*' to call pointer-to-member function in '__f (...)'.

如何解决编译错误?

不要绕弯子,解决它!;) 你在这里写了.而不是,:

for_each(m_abs_list.begin(). m_abs_list.end(), my_func)

还有,没有分号(;)。

一些愚蠢的拼写错误,但更重要的是,您试图传递成员函数,就好像它是一个自由函数一样。成员函数需要特殊的用法——在一般情况下,您可以使用boost:bind。但是在这种情况下,由于它不依赖于任何实例变量,所以最简单的方法就是将其设置为静态。

哦,顺便说一下,使用智能指针。认真对待。不要使用原始指针

你不能像这样使用my_func,因为它是一个成员函数,每个成员函数都链接到一个类,并且需要一个指向这个类的指针来使用。在标准c++中,你必须使用绑定函数(如bind1st)来创建一个函数,该函数包含一个指向对象的指针,你可以将该指针传递给成员函数。

当然,你也可以直接创建一个函子或使用一个自由函数(或类中的静态函数)。如果您正在使用boost,还可以使用boost::bind函数,这些函数比标准函数更容易编写(这不是它们唯一的优点)。(我没有提到boost或c++ 11 lambda)。

如果你不知道functor是什么,它就是一个重新定义了operator()函数的类。所有STL算法都使用它们。

在您的例子中,简单的方法就是创建一个自由函数。当然,您还应该使用智能指针,如boost::shared_ptr,您将在内存管理方面获得相当大的优势。

正如其他人指出的那样,这不是"正确"的方法。但是,这是你想要做的…

std::for_each(m_abs_list.begin(), m_abs_list.end(),
              std::bind1st(std::mem_fun<void, Mock, Abstract*>(&Mock::my_func), this);

我离开了我的开发系统,所以可能会有一些语法错误

您应该使用智能指针(而不是auto_ptr)进行内存管理。

这样,当您的成员列表被销毁时,它将同时释放所有堆分配的内存。

但是,如果你不想这样做,除非你被限制使用不支持lambdas的编译器…

#include <list>
#include <algorithm>
class Abstract
{
    //contains a pure virtual function
};
class Mock
{
public:
   Mock();
 ~Mock()
 {
    std::for_each(m_abs_list.begin(), m_abs_list.end(), [](Abstract *ele)
    { delete ele; });
 } 
private:
   std::list <Abstract *> m_abs_list;
};

相关内容

  • 没有找到相关文章

最新更新