Re move an object from the lua state!
Sympaval <[email protected]> Mon, 1 Aug 2011 21:37:45 -0700 (PDT)
| Newsgroups | gmane.comp.lang.lua.bind.user |
|---|---|
| Message-ID | <[email protected]> |
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
--
View this message in context: http://old.nabble.com/Remove-an-object-from-the-lua-state%21-tp32174811p32174811.html
Sent from the Lua C++ Bind mailing list archive at Nabble.com.
------------------------------------------------------------------------------
BlackBerry® 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