Посмотрев пример Urbi-драйвера для управления сервомашинкой через Arduino можно заметить, что такое смешение кода — не лучший стиль программирования.
Для того чтобы избегать такого «смешения французского с нижегородским», UObject можно использовать в виде обёртки вокруг нашего класса управления(причём последний вообще может оставаться без изменений).
Пример:
#include <urbi/uobject.hh> using namespace urbi; using std::string; // класс, который мы хотим использовать без модификации class MyClass { public: int func1(const string &s){return 0;} }; // UObject - класс-обёртка вокруг MyClass class WrapClass: public UObject, MyClass { public: WrapClass(const std::string& s): UObject(s) { // конструктор urbiScript UBindFunction(WrapClass, init); // доступ к интересующей нас функции UBindFunction(MyClass, func1); } int init() { return 0; } }; UStart(WrapClass);
Теперь в urbiScript можно вызвать эту функцию:
var c = WrapClass.new; c.func1("foo");
именно такой приём я использовал при написании модуля UrbiDuino:
есть класс ArduinoFirmata для общения с Arduino по протоколу Firmata и класс-обёртка Arduino:
class Arduino: public urbi::UObject, ArduinoFirmata
в котором просто реализован конструктор (открытие порта) и прописаны UBindFunction() для всех необходимых функций.