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