tolua ++: добавление функций lua в класс C ++, который был экспортирован в Lua - PullRequest
2 голосов
/ 10 января 2011

Я использую tolua ++ для экспорта некоторых классов C ++ в Lua.

Насколько я понимаю, каждый класс "реализован" на стороне lua, как таблица lua. Мне интересно, возможно ли поэтому добавить новые (Lua) методы в таблицу объектов C ++, чтобы я мог добиться эффекта добавления новых методов в класс C ++.

Предположим, что я экспортирую класс Foobar.

Методы Foobar будут доступны в Lua следующим образом:

Foobar:method1()
Foobar:method2()
...

и т.д.

Я хотел бы иметь возможность добавлять новые методы (newmethod1 и newmethod2) в таблицу "объект" Foobar

У меня есть следующие вопросы:

  1. Можно ли «расширить» функциональность экспортированного объекта C ++ способом, описанным выше?
  2. Как можно добавить новые функции в таблицу Foobar? (Я относительно новичок в Lua)

1 Ответ

3 голосов
/ 10 января 2011

Да, есть возможность добавить новые методы в существующий экспортируемый класс.

Foobar - это простая таблица, поэтому вы можете прикреплять к ней методы, как и в любой другой таблице.[1]

Foobar["extra_method"] = function (self, arg1, arg2) print(arg1, arg2) end

и теперь вы можете сделать:

Foobar:extra_method(1,2)

и 1 2.

[1] tolua ++ работает несколько странно.Он создает одну основную таблицу для каждого класса, которую вы видите как Foobar, которая содержит статические функции-члены класса (например, Foobar:new()) и функции-члены экземпляра класса (например, чтоFoobar:method1() скорее всего есть).Оператор : в lua является синтаксическим сахаром;a:b() преобразуется в a.b(a).Это означает, что когда вы вызываете Foobar:new(), он транспонируется в Foobar:new(Foobar), поэтому аргумент self является таблицей Foobar.Когда вы создаете объект типа Foobar, а затем вызываете для него method1 (), self будет этим объектом.Таким образом, добавление нового метода method3 в таблицу Foobar позволит вам сделать Foobar:method3() и obj = Foobar:new(); obj:method3(), хотя первый вызовет ошибку.Таким образом, этот ответ только работает для tolua ++.

Редактировать: для адреса комментария

Позвольте мне использовать фактический код здесь.Итак, давайте предположим, что у нас есть объявление класса Foobar, которое выглядит следующим образом:

class Foobar {
  public:
    void method1();
    static void method2();
};

Когда tolua ++ генерирует код привязки lua для этого класса, он выдаст вам таблицу со следующими методами

  • new () - Вызовите как Foobar:new(), чтобы создать экземпляр Foobar.
  • delete () - Вызовите как instance:delete(), чтобы уничтожить экземпляр Foobar.
  • method1 ()- Вызовите как instance:method1() для запуска метода1 в экземпляре.
  • method2 () - Вызовите как Foobar:method2() для запуска метода 2.

Однако tolua ++ на самом деле не использует два разныхтаблицы (одна для методов, которые должны быть присоединены к самому классу, а другая для методов экземпляра этого класса).Вместо этого он объединяет их вместе, поэтому можно запускать Foobar:method1() и instance:new() ... даже при том, что методы не должны использоваться.Таким образом, нет никакой разницы между тем, как используются статические методы и как методы экземпляра.Синтаксически это тоже самое.(Я лично чувствую, что это проблема с tolua ++.)

Если вы ищете пример, вот как вы должны вызывать эти функции из lua:

obj = Foobar:new()
print( obj:method1() )
obj:delete()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...