Alo*_*kin 8 c++ static v8 instance
我有以下课程:
class PluginManager
{
public:
Handle<Value> Register(const Arguments& args);
Handle<ObjectTemplate> GetObjectTemplate();
};
Run Code Online (Sandbox Code Playgroud)
我希望可以从JavaScript访问Register方法.我将它添加到全局对象,如下所示:
PluginManager pluginManagerInstance;
global->Set(String::New("register"), FunctionTemplate::New(pluginManagerInstance.Register));
Run Code Online (Sandbox Code Playgroud)
它会引发以下错误:
'pluginManager :: Register':函数调用缺少参数列表; 使用'&PluginManager :: Register'创建指向成员的指针
我试图这样做,但它也不起作用.并且它不正确,因为我希望它调用pluginManagerInstance的Register方法.
除了使Register方法静态或全局,任何想法?
谢谢.
你试图同时绑定两件事:实例和调用它的方法,让它看起来像一个函数指针.不幸的是,这在C++中不起作用.您只能将指针绑定到普通函数或静态方法.因此,您可以添加静态"RegisterCB"方法并将其注册为回调:
static Handle<Value> RegisterCB(const Arguments& args);
...FunctionTemplate::New(&PluginManager::RegisterCB)...
Run Code Online (Sandbox Code Playgroud)
现在从哪里获取pluginManagerInstance?为此,V8中的大多数回调注册apis都有一个额外的"data"参数,该参数将被传递回回调.FunctionTemplate :: New也是如此.所以你实际上想要像这样绑定它:
...FunctionTemplate::New(&PluginManager::RegisterCB,
External::Wrap(pluginManagerInstance))...
Run Code Online (Sandbox Code Playgroud)
然后可以通过args.Data()获取数据,您可以委托实际方法:
return ((PluginManager*)External::Unwrap(args.Data())->Register(args);
Run Code Online (Sandbox Code Playgroud)
对于某些宏,这肯定会变得容易一些.
| 归档时间: |
|
| 查看次数: |
3394 次 |
| 最近记录: |