在C+中获取指向Lua对象实例的指针+; 我使用的是将一个基类从C++暴露到Lua,从中我可以。这部分工作正常,我可以调用来自Lua派生类的C++方法。 现在我想做的是在C++程序中获得一个指向基于LUA的实例的指针。
C++->绑定在C+中获取指向Lua对象实例的指针+; 我使用的是将一个基类从C++暴露到Lua,从中我可以。这部分工作正常,我可以调用来自Lua派生类的C++方法。 现在我想做的是在C++程序中获得一个指向基于LUA的实例的指针。,c++,pointers,lua,luabind,C++,Pointers,Lua,Luabind,C++->绑定 class Enemy { private: std::string name; public: Enemy(const std::string& n) : name(n) { } const std::string& getName() const { return name; } void setName(const std::string& n) { name = n; }
class Enemy {
private:
std::string name;
public:
Enemy(const std::string& n)
: name(n) {
}
const std::string& getName() const {
return name;
}
void setName(const std::string& n) {
name = n;
}
virtual void update() {
std::cout << "Enemy::update() called.\n";
}
};
class EnemyWrapper : public Enemy, public luabind::wrap_base {
public:
EnemyWrapper(const std::string& n)
: Enemy(n) {
}
virtual void update() {
call<void>("update");
}
static void default_update(Enemy* ptr) {
ptr->Enemy::update();
}
};
// Now I bind the class as such:
module(L)
[
class_<Enemy, EnemyWrapper>("Enemy")
.def(constructor<const std::string&, int>())
.property("name", &Enemy::getName, &Enemy::setName)
.def("update", &Enemy::update, &EnemyWrapper::default_update)
];
类敌人{
私人:
std::字符串名;
公众:
敌人(const std::string&n)
:名称(n){
}
常量std::string&getName()常量{
返回名称;
}
void setName(const std::string&n){
name=n;
}
虚拟无效更新(){
std::cout敌军::更新();
}
};
//现在我将类绑定为:
模块(L)
[
类(“敌人”)
.def(构造函数())
.property(“名称”、&敌人::getName、&敌人::setName)
.def(“更新”、&敌方::更新、&EnemyWrapper::默认更新)
];
基于Lua的派生类
class 'Zombie' (Enemy)
function Zombie:__init(name)
Enemy.__init(self, name)
end
function Zombie:update()
print('Zombie:update() called.')
end
类“僵尸”(敌人)
函数Zombie:uu init(名称)
敌人。_uinit(自我,姓名)
结束
函数Zombie:update()
打印('Zombie:update()已调用')
结束
现在让我们假设我从Lua创建了以下对象:
a = Zombie('example zombie', 1)
a=僵尸(“示例僵尸”,1)
如何获取对象的引用作为C++中基类的指针?< /p> < p>如果在Lua中做< /p> zombie = Zombie('example zombie', 1) 从卢阿那叫它
a = Zombie("zombie", 1); AddEnemy(a) a=僵尸(“僵尸”,1); 附录(a) 要知道,如果你这样做了 AddEnemy(Zombie("temp zombie", 1)); AddEnemy(僵尸(“临时僵尸”),1); Lua将在方法调用后删除“temp zombie”,并使指向该对象的任何指针无效。如果在Lua中这样做 zombie = Zombie('example zombie', 1) 从卢阿那叫它 a = Zombie("zombie", 1); AddEnemy(a) a=僵尸(“僵尸”,1); 附录(a) 要知道,如果你这样做了 AddEnemy(Zombie("temp zombie", 1)); AddEnemy(僵尸(“临时僵尸”),1);Lua将在方法调用后删除“temp zombie”,并使指向该对象的任何指针无效。我的上一个问题。您必须向Lua注册表(在本机端)注册该对象。请参阅我对jameszhao00问题的回答。您可以使用Lua注册表获取可以引用特定Lua对象的整数值。该整数值类似于指针,可用于以后检索对象。您必须向Lua注册表(在本机端)注册该对象。请参阅我对jameszhao00问题的回答。您可以使用Lua注册表获取可以引用特定Lua对象的整数值。该整数值类似于指针,可用于以后检索对象。谢谢!这就成功了。也谢谢你关于“临时僵尸”的提示。这个垃圾收集可以通过使用智能/共享指针来解决吗?@sbk,我清理了格式。所以,很明显,Google的Markdown不喜欢项目符号列表附近的代码段落,所以我放弃了项目符号,希望代码清晰。我把LUA代码放在
<代码>标签中,没有缩进,与C++代码一致。谢谢!这就成功了。也谢谢你关于“临时僵尸”的提示。这个垃圾收集可以通过使用智能/共享指针来解决吗?@sbk,我清理了格式。所以,很明显,Google的Markdown不喜欢项目符号列表附近的代码段落,所以我放弃了项目符号,希望代码清晰。我将LUA代码放在 <代码>标签中,没有缩进,与C++代码一致。