Привязка классов 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 комментария:
отличная и нужная статья.
автор малацца
Спасибо, дельная статья.
Отправить комментарий