【发布时间】:2014-05-04 00:03:12
【问题描述】:
我希望我的班级拥有v8::Context 和v8::External 作为成员。因此,我认为我必须使用持久句柄。
class ScriptHelper {
public:
ScriptHelper(v8::Persistent<v8::Context> Context) : context(Context) {
// ...
}
// ...
private:
v8::Persistent<v8::Context> context;
v8::Persistent<v8::External> external;
};
但是,持久句柄在 V8 中是不可复制的,因此代码无法编译。错误发生在两个成员被初始化的行中。对于上下文,this 在构造函数的初始化列表中,对于外部的 this 在构造函数体中。
1> 错误 C2440:“=”:无法从“v8::Primitive *”转换为“v8::Object *volatile”
1> 指向的类型不相关;转换需要 reinterpret_cast、C 样式转换或函数样式转换
1> include\v8\v8.h(603) : 请参阅正在编译的函数模板实例化 'void v8::NonCopyablePersistentTraits::Uncompilable(void)' 的参考
我考虑过使用指向持久句柄的指针,但这似乎违反直觉,因为句柄的概念已经暗示了某种引用。此外,我认为句柄会被破坏,以便 V8 的内部垃圾收集器可以清理对象。
如何将 V8 对象永久存储为类成员?
更新:即使我使用指向持久句柄的指针,对于返回持久句柄的方法,我也会遇到相同的编译器错误。
【问题讨论】:
-
如果你做
ScriptHelper(v8::Handle<v8::Context> Context) : context(Context) {,你会避免错误。你真正想要传递的是context,所以你应该只使用一般的Handle而不是特定类型的句柄。 -
@loganfsmyth 那么我可以使用
Handle<Context>作为成员类型吗? -
不,你仍然会使用持久成员。
-
@loganfsmyth 好的,谢谢。
标签: c++ pointers copy v8 noncopyable