我有一个使用多态性的奇怪问题。我有一个实现静态方法的基类。由于各种原因,此方法必须是静态的。基类还有一个run()
由所有扩展类实现的纯虚方法。我需要能够run()
从静态类调用。
当然,问题在于静态类没有 this 指针。这个方法可以传入一个 void * 参数。我一直在尝试想出一种巧妙的方法将 run 方法传递给它,但到目前为止还没有任何效果。也尝试过将其传递给它。这样做的问题是我必须实例化它,这需要扩展类的知识。这违背了多态性的全部目的。
关于如何解决这个问题的任何想法?
我有一个使用多态性的奇怪问题。我有一个实现静态方法的基类。由于各种原因,此方法必须是静态的。基类还有一个run()
由所有扩展类实现的纯虚方法。我需要能够run()
从静态类调用。
当然,问题在于静态类没有 this 指针。这个方法可以传入一个 void * 参数。我一直在尝试想出一种巧妙的方法将 run 方法传递给它,但到目前为止还没有任何效果。也尝试过将其传递给它。这样做的问题是我必须实例化它,这需要扩展类的知识。这违背了多态性的全部目的。
关于如何解决这个问题的任何想法?
不要将其作为 void* 指针传递,将其作为指针(或引用)传递给基类:
class BaseClass
{
public:
static void something(BaseClass* self) { self->foo(); }
virtual void foo() = 0;
};
当您必须通过 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;
}
}
};
那会有帮助吗?
为什么不传递对对象的引用而不是方法,例如
static void func( BaseObject& o)
{
o.run();
}
IMO,您最好的选择是摆脱静态方法。找到解决方法,你就是金子。