Войти
ПрограммированиеФорумОбщее

виртуализация методов в луа со стороны c++ - как это сделать?

Страницы: 1 2 Следующая »
#0
21:10, 24 янв. 2010

Здравствуйте
У меня такой вопрос:

если класс биндится с помощью tolua++, то как внутри класса из c++ вызвать его метод, перебитый в lua?

например

class TestClass{   
public:   
  virtual float Method(int f,const char* str);   
};   
  
float TestClass::Method(int f,const char* str){   
//  blah-blah-blah   
  return 1.5f;   
}

function NewMethod(this,f,str)
//  blah-blah-blah   
  return 2
end

test=TestClass:new()
test:Method=NewMethod

заранее спасибо за помощь


#1
23:50, 24 янв. 2010

К примеру в boost::python для такого трюка используется наследование от специального класса-враппера, у которого есть метод добычи и вызова переопределённых виртуальных функций. Думаю что-то подобное должно быть и здесь - способ запросить переопределённую функцию и вызвать её.

#2
0:07, 25 янв. 2010

Вот довольно общий способ

Я, правда, обычно с этим борюсь с помощью классов врапперов (конструктор получает имена lua функции, виртуальные методы их вызывают, все молятся, что бы не закорраптилcя стек (хотя класс, ответственный за работу с Lua функциями вовсю изображает, что не допустит всяких неприятностей))

В стиле

class LuaTask : public core::taskmanager::Task
{
public:
  LuaTask(const EString& metName) : m_Fn(metName,0,1)
  {
  }

  virtual
  int operator () ()
  {
    return (int)m_Fn();
  }
private:
  core::lua::LuaFunction    m_Fn;
};

function some_task
    return 0
end

local task = LuaTask:new("some_task")
#3
22:31, 28 янв. 2010

crsib
спасибо за идею, делаю через таски, но не понимаю как сделать так:

function some_task(self)
    self:Method('string')
    return 0
end

local task = LuaTask:new("some_task")
можешь объяснить?:-[
заранее спасибо
#4
22:49, 28 янв. 2010

Не совсем понял. Что в данном контексте self? Данный метод видимо не дает того, чего именно ты хочешь. Он не дает возможности "наследоваться" от С++ класса. Для этого подходит первый метод. Однако он дает возможность прозрачным для С++ образом работать с классом, чьи методы описанны в Lua. Если Lua методу необходим доступ к полям класса, то в чем проблема передавать this класса в Lua? Естественно, при условии, что класс корректно экспортирован в виртуальную машину

#5
0:47, 29 янв. 2010

sergiokey
> если класс биндится с помощью tolua++,
а в luabind для этого есть готовое решение =))
зы. там тоже враппер

sergiokey
> спасибо за идею, делаю через таски,
причем тут таски? ониж для примера просто!

зы. в луабинд очень красиво делается

class 'Derived' ('Base')

function Derived:method()
   print(self.member);
end;

в основнойже программе создается класс, наследник от Base и от luabind::wrap_base
(luabind::wrap_base хранит постоянную ссылку на соотвествующий сишному объекту луа объект, и содержит методы некотрые для удобства)
в данном наследнике переопределяются все интересующие виртуальные методы, и прописываются дефолтовые реализаци. вобщем при желании можно качнуть луабинд да глянуть.
способ довольно удобный, из "лишнего" кода (т.е. не имеющего особой смысловой нагрузки - только дополнительный класс. вобщемто он тривиален, и все методы его умещаются в одну строку)

#6
14:23, 29 янв. 2010

проблема с luabind - сильно долго компилиться(
поэтому все таки tolua++ (перейду только если совсем уж никак)

проблема в чем: мне нужно с одной стороны наследоваться от класса (причем не создавая новый класс, а перебивая действие у текущего экземпляра(если такое возможно)

btn = Button:new()
btn:onClick = function(self)
  print(self:GetText())
end

НО
в то же время мне нужно добраться до того же OnClick(self), (принадлежащего данному объекту (btn) и self - тот же btn, переданный в функцию) из программы (cpp), а не из lua

#7
14:32, 29 янв. 2010

sergiokey
> проблема с luabind - сильно долго компилиться(
Изображение
У меня все быстро компилится. ты ведь не на спектруме пытаешься его скомпилить? и не на сотовом телефоне?

sergiokey
> btn:onClick = function(self)
пиши так
function btn:onClick()
в данном случае self - неявный параметр. а то что ты написал - непонятно как должно работать. (понялбы еслиб было btn.onClick, хотя хз как там реализовано у вас в луа++)

ну и наконец - яж не предлагал тебе использвоать луабинд, я предлагал посмотреть как там это решено.

#8
15:23, 29 янв. 2010

Kloun
> У меня все быстро компилится.
И то, и то долго компилируется. Я использую tolua++, потому что есть готовые бинды для CEGUI. На выходе - файл размером в 5мб. Дык он на C2D компилируется секунд 30.

В Lua
btn:onClick() == btn.onClick(self)
При этом
(btn.onClick = function (self) end)

#9
15:28, 29 янв. 2010

crsib
> В Lua
> btn:onClick() == btn.onClick(self)
> При этом
> (btn.onClick = function (self) end)
ну это очевидно. расскажи что такое btn:onClick = function(self)

#10
15:32, 29 янв. 2010

Что-то мне подсказывает, что ошибка времени компиляции в байткод))

#11
16:29, 29 янв. 2010

crsib
ну вот и я про тоже )

а вообще странно. если толуа++ занимается кодогенерацией, то уж чего проще былобы сделать нормальное наследование?

#12
16:32, 29 янв. 2010

Дык яж привел способ, как делать нормальное наследование)
Просто там пока ограничения - не более одного неймспейса на наследуемый класс, что меня не устраивает... У меня аля гугл код стайл - неймспес отражает путь

#13
17:03, 29 янв. 2010

блин, а я как дурак пытался прикрутить btn:onClick = ...(self)...
btn.onClick = function (self) end
спасибо за подсказку,но тогда эта "OnClick" будет вызываться для всех объектов  или только для этого? (мне кажется что для всех)crsib
> Что-то мне подсказывает, что ошибка времени компиляции в байткод))
тебе правильно подсказывает, я думал, "name.funcname" для объектов не применяется

void Button::OnClick(lua_State* state){
// передается table объекта(btn)
  ...
}

каким образом здесь вызвать все это дело (btn.onClick(self))?

#14
23:52, 29 янв. 2010

sergiokey
> проблема с luabind - сильно долго компилиться(
проблема с tolua++ - сильно долго линкуется)

А если насчёт создание в луа объектов, производных от С++ классов - а оно действительно нужно именно в такой форме?
Я вот решил вызывать виртуальные методы прямо из луа. А там уж при вызове object:someVirtualMethod() может оказаться и честный метод С++ класса, а может быть и какой-нибудь не совсем честный object.someVirtualMethod=function(self)...end. Что положим то и получим.

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.