shared_ptrのは、完全な型を必要とします。 lua_Stateでそれを使用することはできません*
-
19-09-2019 - |
質問
私はLuaのためのC ++ / OOPラッパーを書いています。私のコードは次のとおりです。
class LuaState
{
boost::shared_ptr<lua_State> L;
LuaState(): L( luaL_newstate(), LuaState::CustomDeleter )
{
}
}
問題はlua_Stateが不完全型で、shared_ptrのコンストラクタは完全な型を必要としています。そして私は、安全なポインタの共有を必要とします。 (おかしい事ブーストのドキュメントは、ほとんどの機能は完全な型を必要としないと言うが、コンストラクタが必要ですので、それを使用する方法はありません。<のhref = "http://www.boost.org/doc/libs/1_42_0/libs/ smart_ptr / smart_ptr.htm」REL = "nofollowをnoreferrer"> http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/smart_ptr.htm の)
私はこの問題を解決することができますすることはできますか?ありがとうございます。
解決
あなたは建設時に完全な型を持っている必要はありませんことを意味し、独自のデリータを、使用しています。唯一の要件は、CustomDeleter
がそれを扱うことができるということです。 (それは)void*
からCompleteType*
に(例えば、例えば、完全な型に渡されたポインタを変換することができる。
完全性の背景がshared_ptr
のコンストラクタはデフォルト削除手段と呼ばれたら、それはラインdelete p;
を含むクラスをインスタンス化することである - そして、このコードのために正しいことを、p
は不完全であってはなりません。それはタイプの完全性に依存しないので、デストラクタは、間接的にこのデリータコードを呼び出します。
しかし、あなた自身のデリータの要件が適用されます。 CustomDeleter
が完了になった後lua_State
を定義してください。
他のヒント
これはboost::shared_ptr
がインスタンス化のための完全なタイプを必要とすることを奇妙に見えたので、私は反対(最後のコード)を実証し、この小さな小さなテストを書いています。
私はこの問題は、完全であることを必要とするタイプではありませんが、shared_ptr
コンストラクタに渡している第二引数で、それは、メンバ関数のように見えると信じています。第二引数は、単一のポインタ引数で呼び出し可能なものでなければなりません。あなたのラッパーのメンバ関数を使用する場合は、インターフェースを適応させる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;
}
lua_State *は複製できないことを考えると、意味のあるLuaStateオブジェクトをコピーしていますか?そのような本質的にコピー不可のオブジェクトをコピーの予想意味は何ですか?
あなたが望むように見える行動は、の浅いコピーのである - とLuaStateはコピー不可可能とlua_Stateの寿命を管理するためにそれを行うための最善の方法である、あなたはshared_ptr<LuaState>
ような状態の周りに渡すことができますます。