3

なぜこれで苦労しているのかわかりません。私がやりたいのはこれだけです:

class foo {

public:
    foo(){}
    ~foo(){}
    float a,b;
};

class foo2 {
public:
     foo2(){}
     foo2(const foo &f){*this = f;}
     ~foo2(){}
     void operator=(const foo& f){
          x = f.a;
          y = f.b;
     }
     float x,y;
};

/* Usage(cpp):

   foo f;
   foo2 f2(f);

   //or using the = operator
   f2 = f;
*/

私が抱えている問題は、このコードをスウィッグした後、lua スクリプトを適切に実行する方法がわからないことです。

/* Usage(lua)
   f = example.foo()
   f2 = example.foo2(f) --error
*/

私が得るエラーは「オーバーロードされた関数 'new_Foo2' の間違った引数」です: 考えられる c/c++ プロトタイプは次のとおりです: foo2() foo2(foo const &)

do f2 = f を使用しようとすると、同じことが起こります。私が理解しているように、すべてがポインターとして格納されているため、fooへのポインターを使用するコンストラクターを追加しようとしましたが、役に立ちませんでした。

4

5 に答える 5

1

Lua のネイティブ C API を使用するという提案に沿っていますが、C++ を使用しているため、Luabindを試してください。コツをつかめばとてもうまく機能します。試してみる場合は、必ず最新バージョンを入手してください。最新バージョンは積極的に維持され、常に改善されています。

于 2009-08-08T03:18:14.880 に答える
1

コピー コンストラクターでは、参照演算子が間違った場所にあり、'foo' の後に配置します。あなたのコードがそのままではコンパイルされません。少なくとも VS 2008 の私にとってはそうではありません。

追記:なるほど、更新ありがとうございます。LUA については特に詳しくありませんが、C++ から C# に移植する際に、参照に関していくつかの変更点があることは知っています。したがって、私の唯一の考えは、ref/const ref によって変数を渡していることを明示的に示す必要がある場合です。すなわち。C# では、必要な関数呼び出しで ref を渡すには:

int a = 10;
foo(ref a);

そのため、LUA でこれに似たものが表示されるエラーを引き起こす可能性があります。

于 2009-08-07T17:37:35.020 に答える
1

SWIGが何をしているかは神のみぞ知る。私のアドバイスは、弾丸を噛んで、C++ でも動作する Lua のC APIを使用することです。foo2習得するのはそれほど難しくなく、メソッドを思い通りにオーバーロードすることができます。良い例は、Roberto Ierusalimschy の著書Programming in Lua にあります。前のエディションはオンラインで無料で入手できます。

注: API は C であるため、参照パラメーターからはわかりません。Lua ユーザーデータ オブジェクトには、 class の C++ オブジェクトへのポインターfoo2が含まれている必要があります。

于 2009-08-07T23:01:29.047 に答える
0

swig を使用して lua インターフェースを作成する場合は、代わりにこれを試してください。

foo2(const foo* f){*this = *f;}

swig は参照型に問題がありますが、ポインターからの自動変換は問題なく実行されます。

ここのswigではconst参照が問題だと思います

于 2009-10-08T08:05:09.273 に答える
0

タイプマップを使用して、内部ポインター表現を const 参照に変換する方法を SWIG に伝えることができます。

%typemap(in) const Foo&
{
    if(!SWIG_IsOK(SWIG_ConvertPtr(L,$argnum, (void**)$1, $1_descriptor,1)))
    {
         SWIG_fail;
    }
}

これにより、wrap.cpp ファイルに次のようなコードが生成されます。

if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Foo,1)))
{
  SWIG_fail;
}
result = new Foo2(((Foo const &)*arg1);
SWIG_arg=0;

SWIG_Lua_NewPointerObj(L, result, SWIGTYPE_p_Foo2, 1); SWIG_arg++;
于 2009-11-06T14:46:59.510 に答える