30

Point クラスを公開する公式の例では、プログラム内に固定数のインスタンスがあることを想定しているようです。Javascript でnewが呼び出されたときに、C++ コードで新しいインスタンスがどのように割り当てられるかは明確ではありません。

複数のインスタンスを持つことができるクラスをどのように公開しますか? たとえば、Image クラスは次のようになります。

var img1 = new Image( 640, 480 );
var img2 = new Image( 1024, 768 );

img1.clear( "red" );
img2.clear( "black" );
4

3 に答える 3

30

これは、C++オブジェクトをV8Javascriptに公開することについて私が見つけた最高のブログ投稿です。それはより深い詳細に入り、コードスニペットでそれをより小さなステップに分解します。警告:コードスニペットにはほとんど矛盾がなく、理解するのに数回の読み取りが必要でした。事前に私の簡単な要約を読むことは役立つかもしれません:

  1. オブジェクトはV8テンプレートでラップする必要があります。注:GoogleのサンプルではObjectTemplatesを使用していますが、作成者はFunctionTemplatesを好む理由を説明しています。
    1. FunctionTemplateを作成します。このテンプレートのインスタンスには、C++オブジェクトのメモリアドレスを格納するための内部フィールドがあります。また、クラスのアクセサメソッドも取得します。
    2. これらのFunctionTemplatesの1つでC++オブジェクトをラップする関数wrapObject()を作成します。
  2. コンストラクターも(異なる)V8テンプレートでラップする必要があります。不要な再帰を回避するために、別のテンプレートが使用されます。(両方のテンプレートを1つに結合する方法は、ブログ投稿の最後に記載されています。)
    1. 別のFunctionTemplateを作成します。このテンプレートは、JavaScriptグローバルスコープ(newから呼び出される場所)をC++コンストラクターに接続するだけです。
    2. テンプレートが呼び出すメソッドを作成します。このメソッドは実際にはC++new演算子を使用し、C++クラスコンストラクターを呼び出します。次に、ステップ1.2で作成したwrapObject()メソッドを呼び出して、オブジェクトをラップします。

deleteここで、ステップ2.2で割り当てられたメモリはいつか'dする必要があります。更新:次のブログエントリ「永続ハンドル」では、これについて詳しく説明しています。

これらのブログ投稿でほのめかされている実際のコードに関する私のメモ:

  • ブログのメソッドは、実際には実際のコードwrapPoint()のメソッドに類似しています。いいえunwrap() wrap()
  • コード間のその他の共通点を見つけるには、次を検索します。SetInternalFieldCount(0constructorCall
  • 実際のコードは、MakeWeak()メソッドを使用して、クリーンアップを実行するコールバックメソッドを設定することにより、メモリ管理を行っているようです。
于 2010-10-05T09:36:37.880 に答える
3

これは、v8 でのコンテキストの公開と処理を非常に簡単にする、私がしばらく前に書いたヘルパーです。それが役に立てば幸い。

https://gamedev.stackexchange.com/questions/2796/binding-c-and-v8-javascript-from-google/2797#2797

于 2010-11-26T19:27:54.757 に答える
-12

V8 Jsエンジンでこれを実現する方法は正確にはわかりませんが、Pythonの世界と同様に、次のように実行できます。あなたの画像クラス:

class Image
{
public:
    Image(int w, int h);
    int Width(void) const;
};

いくつかのラッパー関数を記述し、これらの関数をJsの世界に公開します。

Image* Image_New(int w, int h) { return new Image(w, h); }
void Image_Delete(Image* pImage) { delete pImage; }
int Image_Width(const Image* pImage) { return pImage->Width(); }

次のコードをjsファイルに追加します。

var Image = function (w, h) {
    this.image = new Image(w, h);
    this.Width = function() {
        return Image_Width(this.image);
    };
};

そして今、あなたはあなたにコードを働かせることができます。さらに、上記のコードではガベージコレクションのメカニズムが考慮されていないため、特に注意が必要です。

于 2010-06-18T08:58:03.150 に答える