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

当您必须通过 C API 将 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 回答