8

Lua 用の C++/OOP ラッパーを作成しています。私のコードは次のとおりです。

class LuaState
{
     boost::shared_ptr<lua_State> L;

     LuaState(): L( luaL_newstate(), LuaState::CustomDeleter )
     {
     }
}

問題は lua_State が不完全な型であり、shared_ptr コンストラクターが完全な型を必要とすることです。そして、安全なポインタ共有が必要です。(面白いことに、ブーストのドキュメントでは、ほとんどの関数は完全な型を必要としないと書かれていますが、コンストラクターは完全な型を必要とするため、それを使用する方法はありません。http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/smart_ptr.htm )

これを解決できますか?ありがとうございました。

4

3 に答える 3

1

boost::shared_ptrインスタンス化に完全な型が必要になるのは奇妙に思えたので、反対のことを示すこの小さな小さなテストを作成しました(最後のコード)。

問題は、型が完全である必要があることではなく、shared_ptrコンストラクターに渡す2番目の引数にあると思います。これは、メンバー関数のように見えます。2番目の引数は、単一のポインター引数で呼び出し可能なものでなければなりません。ラッパーのメンバー関数を使用する場合はboost::bind、インターフェースを適応させるために使用できます。

多分あなたは意味しましたか?:

 LuaState(): L( luaL_newstate(), boost::bind(LuaState::CustomDeleter,this,_1) )
 {
 }

boost::shared_ptr完全なタイプを必要としないデモンストレーション:

// forward declarations
struct test;
test * create();
void destroy(test *);

// wrapper equivalent to the one in the question
struct wrapper {
   boost::shared_ptr<test> sp;
   wrapper() : sp( create(), destroy ) {}
};

// actual definitions
struct test {};
test * create() { return new test; }
void destroy(test *t) { delete t; }

// make it executable
int main() {
   test t;
}
于 2010-03-12T16:14:38.670 に答える
0

lua_State* を複製できない場合、LuaState オブジェクトをコピーすることは意味がありますか? そのような本質的にコピー不可能なオブジェクトをコピーすることの期待されるセマンティクスは何ですか?

あなたが望むと思われる動作は浅いコピーです- そしてそれを行う最善の方法は、 LuaState をコピー不可能にし、 lua_State の存続期間を管理し、状態を として渡すことができるようにすることshared_ptr<LuaState>です。

于 2010-03-12T16:20:54.873 に答える