for_each在C ++中的用法

时间:2011-10-18 17:16:28

标签: c++ foreach stl-algorithm function-object

#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;
};

基本上,我试图为Abstract中的每个m_abs_list对象调用析构函数。这可以通过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 (...)'.

如何解决编译错误?

5 个答案:

答案 0 :(得分:4)

不要绕过它,修复它! ;)您在这里写了.而不是,

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

此外,没有分号(;)。

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

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

当然,您也可以直接制作仿函数或使用自由函数(或类中的静态函数)。如果你正在使用boost,你也可以使用boost :: bind函数,这些函数比标准函数更容易(它不是唯一的优势)。 (我没有提到boost或C ++ 11 lambdas)。

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

在您的情况下,简单的方法就是创建一个免费的功能。当然,你也应该使用如果你能像boost :: shared_ptr这样的智能指针,你将在内存管理方面获得相当大的优势。

答案 3 :(得分:1)

您应该使用智能指针(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;
};

答案 4 :(得分:1)

正如其他人所指出的那样,这不是“正确”的做法。但是,这就是你要做的......

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

我离开了我的开发系统,因此可能存在一些语法错误。