1

私は関数ポインタのリストを持つクラスを持っています。 これらの関数ポインタは次のようにバインドされたサブクラスのメンバ関数を指す:でfunctionlistを持つクラスをコピーするときにコピーコンストラクタでの関数ポインタのリバック

functionList.push_back(std::bind(&SubClass::function, this, std::placeholders::_1, std::placeholders::_2)); 

は今、関数ポインタはまだ古いクラスを指します。 関数ポインタを新しいクラスに再バインドするにはどうすればよいですか?

ここではサンプルコード:

#include <vector> 
#include <functional> 

class SomeClass 
{ 

}; 

class testClass 
{ 
public: 
    typedef std::function<void(const SomeClass& var1, const SomeClass& var2)> transitionFunction; 




    testClass(){} 
    testClass(const testClass&s) 
    { 
     for(transitionFunction func : s.functionList) 
     { 
      // how to rebind the function pointer to the new this? 
      functionList.push_back("???"); 
     } 
    } 

    std::vector<transitionFunction> functionList; 


}; 


class SubClass : public testClass 
{ 
    SubClass() 
    { 
     functionList.push_back(std::bind(&SubClass::function, this, std::placeholders::_1, std::placeholders::_2)); 
    } 

    void function(const SomeClass& var1, const SomeClass& var2) 
    { 

    } 

}; 

ありがとう!

+0

関数が 'testClass'で宣言されているかのように' testClass'型のオブジェクトに対して 'SubClass :: function(const SomeClass&、const SomeClass&)'を呼び出すとしますか?それはうまくいきません... あなたはより詳細な方法で達成しようとしていることを記述することができますので、適切な解決策を見つけることができます! –

+0

そのような関数を「再バインド」することはできません。他の方法で目標を達成するためには、クラスを再設計する必要があります。 –

+0

"functionListで**クラス**をコピーすると、関数ポインタは古い**クラス**を指していますが、新しい**クラス**への関数ポインタをどのように再バインドできますか?おそらく* object *を意味するでしょう。 – user2079303

答えて

3

サブクラスをコピーする必要があります。実際に - あなたは自分のコピーコンストラクタでは、デフォルトの初期化が必要になります場合は

class SubClass : public testClass 
{ 
    ... 
    SubClass(const SubClass&) : SubClass() 
    {} 
    ... 
}; 

は、あなたの例は非常に単純化された例である、あなたはrebind機能と独自のfunctionクラスを持っている必要があります。

[UPDATE]

その再バインドを覚えてあなたのサブクラスの義務である - 私はこのような何かをしたい、そう:

あなたのベースクラスは、単にデフォルトのコピーを持っている必要があります(あなたはこれを指定しない場合があります - デフォルトはデフォルト):

class testClass 
{ 
public: 
    ... 
    testClass(const testClass&s) = default; 
    ... 
}; 

次のステップは、あなたのサブクラスで再バインドを実装することです、そして、

SubClass() 
    { 
     functionList.push_back(FunctionWrapper{this, std::bind(&SubClass::function, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)}); 
    } 

サブクラスにコピーします。:

建設を少し変更

SubClass(const SubClass& source) : testClass(source) 
    { 
     for (auto& f: functionList) 
      f = rebind(f); 
    } 

demo作業します。

+0

はい、簡略化されています。私は、基本クラスから呼び出す仮想関数内のベクトルの母集団を行うことができます。または、他のスレッドと同様に再バインドを実行します。しかし、まだ成功していない。 – veio

+1

「再バインディング」を行う方法を説明した作業デモを追加しました – PiotrNycz