我正在写为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

可我能解决这个问题?谢谢你。

有帮助吗?

解决方案

您使用的是自己删除器,这意味着你不必有在建设一个完整的类型。唯一的要求是,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>的最佳途径

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top