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

基本的に、私は各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 (...)'.

コンパイルエラーを回避するにはどうすればよいですか?

4

5 に答える 5

4

いくつかのばかげたタイプミスですが、もっと重要なのは、メンバー関数をフリー関数であるかのように渡そうとしていることです。メンバー関数には特別な使用法が必要です。一般的な場合、boost:bindを使用できます。ただし、この場合、インスタンス変数に依存しないため、最も簡単な方法は静的にすることです。

ああ、ちなみに、スマートポインタを使用してください。真剣に。生のポインタは使用しないでください。

于 2011-10-18T17:22:36.017 に答える
4

それを回避しないでください、それを修正してください!.;) ここではなく、次のように書き,ました:

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

また、セミコロン ( ;) はありません。

于 2011-10-18T17:18:49.390 に答える
1

my_funcはメンバー関数であり、すべてのメンバー関数はクラスにリンクされており、使用するにはこのクラスへのポインターが必要であるため、このようにmy_funcを使用することはできません。標準のC++では、バインド関数(bind1stなど)を使用して、メンバー関数に渡すことができるオブジェクトへのポインターを含むファンクターを作成する必要があります。

もちろん、ファンクターを直接作成したり、free関数(またはクラス内の静的関数)を使用したりすることもできます。boostを使用している場合は、boost :: bind関数を使用することもできます。これは、標準の関数よりも記述が簡単です(これが唯一の利点ではありません)。(ブーストやC ++ 11ラムダについては触れません)。

ファンクターが何であるかわからない場合、それはそのoperator()関数を再定義するクラスです。すべてのSTLアルゴリズムはそれらを使用するように作られています。

あなたの場合、簡単な方法はただ無料の関数を作成することです。もちろん、boost :: shared_ptrのようなスマートポインタができる場合にも使用する必要があります。これにより、メモリ管理でかなりの利点が得られます。

于 2011-10-18T17:27:45.893 に答える
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

メモリ管理にはスマート ポインター (auto_ptr 以外) を使用する必要があります。

そうすれば、メンバー リストが破棄されたときに、ヒープに割り当てられたメモリが一緒に解放されます。

ただし、それを行いたくない場合、およびラムダをサポートしないコンパイラの使用に制限されていない限り...

#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 に答える