Реализация и наследование классов C++ в Lua с использованием SWIG

Можно ли использовать Lua и SWIG и, скажем, класс IInterface, чтобы реализовать этот интерфейс и создать экземпляр всего этого в Lua? Если да, то как это сделать?


person Tom J Nowell    schedule 23.11.2009    source источник


Ответы (2)


Во-первых, интерфейсы в стиле C++ теперь имеют смысл в таком языке, как Lua. Чтобы объект Lua соответствовал интерфейсу, он просто должен содержать определения для всех функций в этом интерфейсе. Нет необходимости в каком-либо конкретном наследовании. Например, если у вас есть такой интерфейс C++:

// Represents a generic bank account
class Account {
    virtual void deposit(double amount) = 0;
};

вы можете реализовать его на Lua без каких-либо конкретных спецификаций наследования:

SavingsAccount = { balance = 0 }
SavingsAccount.deposit = function(amount)
    SavingsAccount.balance = SavingsAccount.balance + amount
end

-- Usage
a = SavingsAccount
a.balance = 100
a.deposit(1000)   

Короче говоря, вам не нужен интерфейс C++. Если вам нужно расширить функциональность класса C++ из Lua, вы должны обернуть это в объект Lua, как описано здесь и выполните "метатабличное" наследование, как описано здесь . Также прочтите раздел об объектно-ориентированном программировании в руководстве по Lua.

person Vijay Mathew    schedule 23.11.2009
comment
Я знаю об этом руководстве, и оно не реализует то, что я хочу. Это говорит мне, что класс C++ B, наследуемый от класса A C++, все еще может использоваться в lua. Но он не сказал бы мне, как объявить и создать экземпляр класса C lua, наследуемого от класса C++ B? - person Tom J Nowell; 23.11.2009
comment
Ну, я полагаю, что проблема здесь в том, чтобы реализовать это таким образом, что мне пришлось бы реализовать его, используя функции в файле lua в сочетании с моим собственным обработчиком объектов на основе lua. У меня уже есть обработчик объектов C++, и я предпочел бы, чтобы мои объекты lua работали в этой существующей инфраструктуре, поскольку такой дополнительный уровень убрал бы тонну архитектурного материала и в результате резко увеличил бы накладные расходы в областях. - person Tom J Nowell; 24.11.2009
comment
Например, события. В желаемой системе их получат только те объекты lua, которым требуется уведомление о событиях, в обходном пути, о котором я говорил выше, не нужно будет перехватывать все события, а затем переопределять код, и у меня будет C и реализация того же кода на lua с дополнительными накладными расходами и архитектурной сложностью. - person Tom J Nowell; 24.11.2009
comment
Я хотел бы иметь возможность взять приведенный выше пример сберегательного счета и отправить сам объект «а» и обрабатывать его на стороне C программы, как если бы это был объект C. - person Tom J Nowell; 24.11.2009

Сохраните таблицу в классе C++, удерживая указатель на состояние lua и ссылку, возвращаемую для таблицы, как указано с помощью этого API:

http://www.lua.org/pil/27.3.2.html

Затем, когда вызывается метод класса-оболочки, поместите ссылочный объект в стек и выполните необходимый вызов функции.

person Tom J Nowell    schedule 13.01.2010