在C+中获取指向Lua对象实例的指针+; 我使用的是将一个基类从C++暴露到Lua,从中我可以。这部分工作正常,我可以调用来自Lua派生类的C++方法。 现在我想做的是在C++程序中获得一个指向基于LUA的实例的指针。

在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; }

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; 
  }

  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++代码一致。