#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 (...)'.
如何解决编译错误?
答案 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);
我离开了我的开发系统,因此可能存在一些语法错误。