Developing C wrapper API for Object-Oriented C++ codeで説明されているモデルを使用して、V8 API用の単純なCラッパーを作成することにしました。残念ながら、私はあまりC++に精通していないので、継承されたコンストラクタに関する問題に取り掛かります。C++クラスから継承した構造体で正しいコンストラクタを呼び出せません
v8capi.h
typedef struct V8Context V8Context;
#ifdef __cplusplus
extern "C" {
#endif
V8Context *V8_NewContext();
#ifdef __cplusplus
}
#endif
v8capi.cpp
#include <v8.h>
struct V8Context : public v8::Handle<v8::Context> { };
V8Context *V8_NewContext() {
v8::HandleScope hscope;
return new V8Context(v8::Context::New());
}
私が理解から、new V8Context(...)
はHandle<T>
を取るv8::Handle<T>
のコンストラクタを呼び出す必要があります。 v8::Context::New()
はを返します。これはv8::Handle<T>
を継承しているため、うまくいくはずです。しかし、現実には、const V8Context &
を取るコンストラクタを呼び出すようにしようとしている:私は間違って
error C2664: 'V8Context::V8Context' : cannot convert parameter 1 from
'v8::Persistent<T>' to 'const V8Context &'
with
[
T=v8::Context
]
No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called
何をしているのですか?
私はV8に精通していません。しかし、その外観からは、C++の強みを非常に悪用していると思われます。また、「すてきなCインターフェイスを抽出する」ことは、不可能と困難の間のどこかにあります。 Cでは、HandleScopeとLocal <>の処理の恩恵を受けることはできません。間接的な追加レイヤーを使用することになってしまいました。おそらくC++を学ぶことを検討してください。 – sellibitze
はい、API全体をラッピングするのは難しいと思いますが、例としてContextを使用しました。私はおそらく、関数を登録し、プロパティを設定/取得してVMをC++で初期化することができる最小限の機能を実装するつもりですが、ロード可能なモジュールはCで記述することができます。そのローカルスコープは、私はそれを永続的な(それは私がそれを理解する方法です、少なくとも)に変換することができます。 –