代码之家  ›  专栏  ›  技术社区  ›  Zack The Human Kunal

在C++中获取一个指向LUA对象实例的指针

  •  1
  • Zack The Human Kunal  · 技术社区  · 15 年前

    我正在使用 Luabind 将基类从C++暴露为Lua,从中我可以 derive classes in Lua .这部分工作正常,我可以调用来自Lua派生类的C++方法。

    现在我要做的是在我的C++程序中获得一个指向基于LUA的实例的指针。

    C++&G.结合

    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)
    ];
    

    基于Lua的派生类

    class 'Zombie' (Enemy)
    
    function Zombie:__init(name)
        Enemy.__init(self, name)
    end
    
    function Zombie:update()
        print('Zombie:update() called.')
    end
    

    现在假设我有以下从Lua创建的对象:

    a = Zombie('example zombie', 1)
    

    我怎样才能得到这个对象的引用作为C++中基类的指针呢?

    1 回复  |  直到 15 年前
        1
  •  5
  •   RBerteig Keith Adler    15 年前

    如果在卢亚,你会的

    zombie = Zombie('example zombie', 1)
    

    然后你可以得到僵尸的值,如下所示:

    object_cast<Enemy*>(globals(L)["zombie"]);
    

    ( object_cast globals 是Luabind命名空间的成员, L 是你的夏威夷州吗) 这假设您知道在Lua中创建的变量的名称。

    你可以总是调用一个来自Lua的C++方法,该方法使用一个指向敌人的指针:

    void AddEnemy(Enemy* enemy) { /* ... */ }
    //...
    module(L) [ def("AddEnemy", &AddEnemy) ]
    

    从Lua打来

    a = Zombie("zombie", 1);
    AddEnemy(a)
    

    注意如果你这样做了

    AddEnemy(Zombie("temp zombie", 1));
    

    Lua将在方法调用后删除“临时僵尸”,并使指向对象的任何指针无效。