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

Basically, I am trying to call the destructor for each Abstract object in the m_abs_list. This can be easily achieved by a for loop. But I am trying to used for_each in this context.

On compilation I get error:

/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 (...)'.

How do i get around the compilation error ?

4

5 回答 5

4

不要绕过去,修好它!;) 你写.的不是,在这里:

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

此外,没有分号 ( ;)。

于 2011-10-18T17:18:49.390 回答
4

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

哦,顺便说一下,使用智能指针。严重地。不要使用原始指针。

于 2011-10-18T17:22:36.017 回答
1

正如其他人指出的那样,这不是做到这一点的“正确”方式。但是,这就是你想要做的......

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

我远离我的开发系统,所以可能存在一些语法错误。

于 2011-10-18T20:33:02.717 回答
1

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

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

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

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

于 2011-10-18T17:27:45.893 回答
1

您应该使用智能指针(auto_ptr 除外)进行内存管理。

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

但是,如果您不想这样做并且除非您被限制使用不支持 lambda 的编译器...

#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;
};
于 2011-10-18T17:29:19.767 回答