3

ポリモーフィズムを使用して奇妙な問題があります。静的メソッドを実装する基本クラスがあります。このメソッドは、さまざまな理由から静的でなければなりません。run()基本クラスには、すべての拡張クラスによって実装される純粋仮想メソッドもあります。run()静的クラスから呼び出すことができる必要があります。

もちろん問題は、静的クラスに this ポインターがないことです。このメソッドは void * パラメータで渡すことができます。run メソッドをそれに渡す巧妙な方法を考え出そうとしていますが、これまでのところ何も機能していません。これをそれに渡そうとしました。これに関する問題は、それをインスタンス化する必要があることです。これには、拡張クラスの知識が必要です。これは、ポリモーフィズムの目的全体を無効にします。

これをどうやって進めるかについてのアイデアはありますか?

4

4 に答える 4

10

void* ポインターとして渡さないでください。基本クラスへのポインター (または参照) として渡します。

class BaseClass
{
public:
  static void something(BaseClass* self) { self->foo(); }
  virtual void foo() = 0;  
};
于 2009-10-09T14:46:15.767 に答える
5

これは通常、CAPIを介してC++オブジェクトをリスする必要がある場合に発生します。典型的な例はスレッドクラスです。

これを行うための標準的なイディオムは次のとおりです。

/** calls thread_func in a new thread passing it user_data as argument */
thrd_hdl_t c_api_thread_start(int (*thread_func)(void*), void* user_data);

/** abstract thread base class
* override my_thread::run to do work in another thread
*/
class my_thread {
  public:
    my_thread() hdl_(c_api_thread_start(my_thread::thread_runner,this)) {}
    // ...

  private:
    virtual int run() = 0; // we don't want this to be called from others

    thrd_hdl_t hdl_; // whatever the C threading API uses as a thread handle

    static int thread_runner(void* user_data)
    {
      my_thread* that = static_cast<my_thread*>(user_data);
      try {
        return that->run();
      } catch(...) {
        return oh_my_an_unknown_error;
      }
    }
};

それは役に立ちますか?

于 2009-10-09T15:06:25.573 に答える
3

メソッドではなくオブジェクトへの参照を渡さないのはなぜですか。

static void func( BaseObject& o)
{
     o.run();
}
于 2009-10-09T14:46:10.603 に答える
1

IMO、あなたの最善の策は、静的メソッドを取り除くことです。それを回避する方法を見つけてください。

于 2009-10-09T14:51:36.660 に答える