1

Luabindを使用して、C++ から Lua に基本クラスを公開し、そこから Lua のクラスを派生させることができます。この部分は正しく機能し、Lua の派生クラスから C++ メソッドを呼び出すことができます。

次に、C++ プログラムで Lua ベースのインスタンスへのポインターを取得します。

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

Lua ベースの派生クラス

クラス「ゾンビ」(敵)

関数 Zombie:__init(名前)
    Enemy.__init(自分、名前)
終わり

関数 Zombie:update()
    print('Zombie:update() が呼び出されました。')
終わり

ここで、Lua から作成された次のオブジェクトがあるとします。

a = Zombie('ゾンビの例', 1)

そのオブジェクトの参照を C++ の基本クラスへのポインタとして取得するにはどうすればよいですか?

4

1 に答える 1

5

Luaの場合

ゾンビ = ゾンビ('ゾンビの例', 1)

次に、次のようにゾンビの値を取得できます。

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

(object_castglobalsは luabind 名前空間のメンバーですL。 は Lua の状態です) これは、Lua で作成する変数の名前を知っていることを前提としています。

Enemy へのポインターを取る C++ メソッドを Lua からいつでも呼び出すことができます。

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

Luaから呼び出す

a = Zombie("ゾンビ", 1);
AddEnemy(a)

する場合は注意してください。

AddEnemy(Zombie("仮ゾンビ", 1));

Lua は、メソッド呼び出しの後に「一時的なゾンビ」を削除し、オブジェクトへのポインターを無効にします。

于 2009-09-18T08:50:50.743 に答える