вторник, 15 апреля 2008 г.

Экспортирование C++ классов в luabind

Привязка классов C++ к lua не на много сложнее, чем функции. Она реализована с помощью шаблона class_ и метода def, который регистриует конструкторы, методы, переменные и деструкторы. class_::def возвращает this указатель на редактируемую цепочку.

Класс животного:

class Animal
{
private:

int m_iNumLegs;

std::string m_NoiseEmitted;

public:

Animal(std::string NoiseEmitted,
int NumLegs):m_iNumLegs(NumLegs),
m_NoiseEmitted(NoiseEmitted)
{}

virtual ~Animal(){}

virtual void Speak()const
{std::cout << "\n[C++]: " << m_NoiseEmitted << std::endl;}

int NumLegs()const{return m_iNumLegs;}
};


экспорт класса с помощью luabind:

module(pLua)
[
class_<Animal>("Animal")
.def(constructor<string, int>())
.def("Speak", &Animal::Speak)
.def("NumLegs", &Animal::NumLegs)
];


Теперь можно применять этот класс в lua скрипте:


--создание объекта животное и вызов его методов

cat = Animal("Мяу", 4);

print ("\n[Lua]: У кота "..cat:NumLegs().. " ног.");

cat:Speak();


Заметьте, что в скрипте используется оператор : для вызовов методов. Другой путь вызова метода: cat.Speak(cat). Методы можно вызывать любым из указанных способов. Классы в lua представлены в виде таблиц, каждый элемент таблицы представляет собой метод или переменную класса.

Классы-наследники тоже легко экспортировать с помощью luabind. Пример класса, полученного от класса Animal:


class Pet : public Animal
{
private:

std::string m_Name;

public:

Pet(std::string name,
std::string noise,
int NumLegs):Animal(noise, NumLegs),
m_Name(name)
{}

std::string GetName()const{return m_Name;}
};


Используя luabind, класс Pet легко привязывать к lua. Это делается с помощью параметра шаблона bases<base class>, который определяет родительский класс:


module(pLua)
[
class_<Pet, bases<Animal> >("Pet")
.def(constructor<string, string, int>())
.def("GetName", &Pet::GetName)
];


Если ваш класс был создан при помощи множественного наследования, то каждый родительский класс должен быть прописан в bases<> и разделен запятыми:


class_<Derived, bases<Base1, Base2, Base3> >("Derived")

2 комментария:

Анонимный комментирует...

отличная и нужная статья.
автор малацца

KTYJIX комментирует...

Спасибо, дельная статья.