10

v8::Contextクラスに aと av8::Externalをメンバーとして保持したい。したがって、永続ハンドルを使用する必要があると考えました。

class ScriptHelper {
public:
    ScriptHelper(v8::Persistent<v8::Context> Context) : context(Context) {
        // ...
    }
    // ...
private:
    v8::Persistent<v8::Context> context;
    v8::Persistent<v8::External> external;
};

ただし、永続ハンドルは V8 ではコピーできないため、コードはコンパイルされません。エラーは、2 つのメンバーが初期化される行で発生します。コンテキストの場合、これはコンストラクターの初期化子リストにあります。外部の場合、これはコンストラクター本体の内部にあります。

1> エラー C2440: '=' : 'v8::Primitive *' から 'v8::Object *volatile ' に変換できません
1> 指す型は無関係です。
変換には、 reinterpret_cast 、C スタイルのキャスト、または関数スタイルのキャストが必要です

永続的なハンドルへのポインターを使用することを考えましたが、ハンドルの概念は既に何らかの参照を意味しているため、直観に反するように思えます。さらに、V8の内部ガベージコレクターがオブジェクトをクリーンアップできるように、ハンドルが破棄されると思います。

V8 オブジェクトをクラス メンバーとして永続的に保存するにはどうすればよいですか?

更新: 永続ハンドルへのポインターを使用しても、永続ハンドルを返すメソッドに対して同じコンパイラ エラーが発生します。

4

1 に答える 1

21

デフォルトでは、永続ハンドルはコピー不可能な特性を使用します。コピー可能なトレイトをテンプレート引数として明示的に渡すと、以前のバージョンのように機能します。

Persistent<Value, CopyablePersistentTraits<Value>> persistent(isolate, value);
于 2014-03-25T23:34:02.530 に答える