SWIG-Lua вопрос о возвращении класса другим классом - PullRequest
0 голосов
/ 19 мая 2010

Я конкретизирую вопрос, который у меня был раньше.

У меня есть два класса в C ++, и я использую SWIG, чтобы обернуть их. Метод в одном классе может возвращать указатель на другой класс. Как я могу заставить Lua видеть в нем нечто большее, чем просто пользовательские данные?

Конкретнее:

У меня есть

class fruit
{
     int numberofseeds;
  //some other stuff about fruit constructors etc...
   public:
     getseedcount()
     {
        return numberofseeds;
     }
}

class tree
{
    fruit * apple; 
    public:
      //constructors and whatnot
    fruit * getfruit()
    {
         return apple;
    }

}

Я заключаю эти два класса в SWIG, чтобы получить к ним доступ в Lua

Так что я могу получить в Lua объект x = pomona.tree (grannysmith) .

Теперь у меня вопрос: как мне организовать вещи, чтобы при наборе y = x: getfruit () я получал объект типа pomona: fruit ? Где я могу написать что-нибудь строчку y: getseedcount () ? На данный момент все, что я получаю, это userdata, которые не съедобны.

1 Ответ

1 голос
/ 20 мая 2010

Если ваш SWIG-файл .i настроен правильно, вы можете использовать оператор «:»:

local y = x:getfruit()
local z = y:getseedcount()

См. Раздел «Классы» (23.2.7) документации SWIG Lua .

Если это не сработает, вам нужно указать SWIG, как преобразовать параметр fruit * out в представление Lua, используя карту типов в вашем .i-файле. Что-то вроде:

%typemap(out) fruit*
{
    swig_module_info* module = SWIG_GetModule(L);
    swig_type_info* typeInfo = SWIG_TypeQueryModule(module, module, "fruit *");

    SWIG_NewPointerObj(L, $1, typeInfo, 1);
}
...