Re: Re move an object from the lua state!

Andreas Grob <[email protected]> Tue, 02 Aug 2011 11:15:20 +0200
Newsgroups gmane.comp.lang.lua.bind.user
Message-ID <[email protected]>
Hi,

if you really want to transfer ownership from lua to c++, you can use
the adopt policy.
There is an example in the documentation:
http://www.rasterbar.com/products/luabind/docs.html#adopt

Regards,
Andreas

Am 02.08.2011 06:37, schrieb Sympaval:
> Hi all!
>
> I a  problem since two days now, while integreting lua to C++. I look at all
> message corresponding to that issue here, but the answers are not clearly
> explaned to help me, and here I would like to get the ritght way to achieve
> what I would like to do.
>
> In fact I have a c++ class wraped with luabind and exported to lua. I would
> like to be able to create a new instance of my class in lua, get it and
> delete it from c++. 
> Actually i can create new instances of my object, and delete them without
> problem, but when I close the lua state with lua_close(myLuaState), the
> programme segfault. When i comment thje lua_close function all thinks are
> ok. I realise that it's beacause when the lua_close is called, it tries to
> call the destructor of all objects in the  lua state. 
> Then I would like to delete the object from the c++ side when i want, and
> remove it from the lua state. How can i achieve that?
> This question has been already posted here in another way, but i didn't find
> a answer which solve my problem.
> I read the programming in lua documentation but I do not see how to proceed.
> This is my code.
>
> extern "C" {
> #include <lua.h>
> }
>
> #include <iostream>
> #include <lua.hpp>
> #include <luabind.hpp>
> #include <stdio.h>
>
> class Enemy {
> private:
>   std::string name;
>
> public:
>   Enemy(const std::string& n)
>     : name(n)
>   {
>     std::cout << "New enemy born with name : " << name << ".\n";
>   }
>
>   Enemy(Enemy const & other)
>     : name(other.name)
>   {
>     std::cout << "Copy of enemy made : " << other.name << ".\n";
>   }
>
>   const std::string& getName() const
>   {
>     std::cout << "Enamy name has been asked and given.\n";
>     return name;
>   }
>
>   void setName(const std::string& n) {
>     name = n;
>   }
>
>   virtual int update()
>   {
>     std::cout << "Enemy::update() called.\n";
>     return (43);
>   }
> };
>
> class EnemyWrapper : public Enemy, public luabind::wrap_base {
> public:
>   EnemyWrapper(const std::string& n)
>     : Enemy(n) {
>   }
>
>   virtual int update() {
>     return (call<int>("update"));
>   }
> }
>
> Enemy * CreateEnemy(std::string const & name)                                                                                                                                             
> {
>   return new Enemy(name);
> }
>
>
> int main() {                                                                                                                                                      
> lua_State *  L = lua_open()                                                                                                                                            
>   luabind::open(L);
>   luaL_openlibs(L);
>                                                                                                                                                 
>   luabind::module(L) [
>                       luabind::class_<Enemy, EnemyWrapper>("Enemy")
>                       .def(luabind::constructor<const std::string&>())
>                       .property("name", &Enemy::getName, &Enemy::setName)
>                       .def("update", &Enemy::update,
> &EnemyWrapper::default_update)
>                       .def("CreateEnemy", &CreateEnemy)
>                       ];
>                                                                                                                                                
>   if (luaL_dofile(L, "wrapping.lua") != 0)
>     std::cout << lua_tostring(L, -1) << std::endl;                                                                                                          
>   int i = 1;
>   for (; i <= 10; ++i)
>     {
>       std::cout << i << " " ;
>       Enemy * e = luabind::call_function<Enemy *>(L, "CreateEnemy", "toto");                                                                   
>       printf("%p :", e);
>       std::cout << e->update() << std::endl;
>       sleep(1);
>       delete e;
>     }
>   lua_close(L);
> }
>
> Lua code:
> print("Start the  script"); 
>                                                                                                                                         
> class 'Zombie' (Enemy)
>
> function Zombie:__init(name)
>    Enemy.__init(self, name);
> end
>
> function Zombie:update()
>    print('Zombie:update() called.');
>    self.talk();
>    return (72);
> end
>
> function Zombie:talk()
>    print("Yeah I'm a monster");
> end
>
> function CreateEnemy(name)             
> return(Zombie(name));
> end
>
>
>
>
>
>
>
>
>

------------------------------------------------------------------------------
BlackBerry&reg; DevCon Americas, Oct. 18-20, San Francisco, CA
The must-attend event for mobile developers. Connect with experts. 
Get tools for creating Super Apps. See the latest technologies.
Sessions, hands-on labs, demos & much more. Register early & save!
http://p.sf.net/sfu/rim-blackberry-1

_______________________________________________
luabind-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/luabind-user
smime.p7s (application/pkcs7-signature, 2 KB) - not displayed