2015-06-02 3 views
6

В моем конкретном случае у меня есть сложный класс (класс классов классов), который я хочу выставить на язык сценариев (aka Ruby). Скорее, это тот факт, что он передал этот сложный класс, кто-то дал мне идею просто открыть несколько функций для скриптового языка, такого как Ruby, который казался более простым. Я видел Райса, но единственные примеры, которые я видел, используют простые функции, которые просто что-то умножают, а не взаимодействуют с классом.Вызов функций класса C++ из Ruby/Python

Для простоты, у меня есть простой класс с функциями я хочу выставить:

class Foo 
{ 
    private: 
     //Integer Vector: 
     std::vector<int> fooVector; 

    public: 
     //Functions to expose to Ruby: 
     void pushBack(const int& newInt) {fooVector.push_back(newInt);} 
     int& getInt(const int& element) {return fooVector.at(element);} 
}; 

ТАКЖЕ:

Я предпочел бы не только иметь ссылку на страницу закачки SWIG или статья объясняет, как сделать это с рисом, который был написан в 2010 году, я хотел бы руководство, которое, скорее всего, работать (я не везло только пока)

Aswell:

Я использую Linux (Ubuntu), но это кросс-совместимая программа, поэтому я должен быть в состоянии скомпилировать на Windows, и OS X

EDIT:

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

+0

После некоторых исследований, я видел tha t Ruby не может быть лучшим языком для встраивания с C++. Если это так, я могу изменить вопрос, поэтому язык сценариев - это Python, если он имеет больше смысла и не приведет к аннулированию любых ответов. – bboy3577

+0

Итак, вы можете добавить тег 'python' к вопросу, чтобы привлечь особое внимание. – hedgesky

+0

@hedgesky Спасибо, что напомнили мне, я полностью забыл об этом вопросе, пока Орфби не принесла щедрость. – bboy3577

ответ

2

Вы можете использовать cython или Boost.Python, чтобы вызвать собственный код из python. Поскольку вы используете C++, я бы рекомендовал посмотреть на Boost.Python, который предлагает очень естественный способ обертывания классов C++ для python.

В качестве примера (близко к тому, что вы предоставили), Рассмотрим следующие определения класса

class Bar 
{ 
private: 
    int value; 

public: 
    Bar() : value(42){ } 

    //Functions to expose to Python: 
    int getValue() const { return value; } 
    void setValue(int newValue) { value = newValue; } 
}; 

class Foo 
{ 
private: 
    //Integer Vector: 
    std::vector<int> fooVector; 
    Bar bar; 

public: 
    //Functions to expose to Python: 
    void pushBack(const int& newInt) { fooVector.push_back(newInt); } 
    int getInt(const int& element) { return fooVector.at(element); } 
    Bar& getBar() { return bar; } 
}; 

double compute() { return 18.3; } 

Это может быть завернуты в питона с помощью Boost.Python

#include <boost/python.hpp> 
BOOST_PYTHON_MODULE(MyLibrary) { 
    using namespace boost::python; 

    class_<Foo>("Foo", init<>()) 
     .def("pushBack", &Foo::pushBack, (arg("newInt"))) 
     .def("getInt", &Foo::getInt, (arg("element"))) 
     .def("getBar", &Foo::getBar, return_value_policy<reference_existing_object>()) 
    ; 

    class_<Bar>("Bar", init<>()) 
     .def("getValue", &Bar::getValue) 
     .def("setValue", &Bar::setValue, (arg("newValue"))) 
    ; 

    def("compute", compute); 
} 

Этот код может быть скомпилирован в статическая библиотека MyLibrary.pyd и используется следующим образом

import MyLibrary 

foo = MyLibrary.Foo() 
foo.pushBack(10); 
foo.pushBack(20); 
foo.pushBack(30); 
print(foo.getInt(0)) # 10 
print(foo.getInt(1)) # 20 
print(foo.getInt(2)) # 30 

bar = foo.getBar() 
print(bar.getValue()) # 42 
bar.setValue(17) 
print(foo.getBar().getValue()) #17 

print(MyLibrary.compute()) # 18.3 
+0

Это прекрасно, но одна вещь, как бы я сделал это для нормальной функции вместо функции класса? – bboy3577

+0

Отредактировано в качестве примера. Boost.Python действительно замечательный, я бы рекомендовал вам ознакомиться с этой вики для получения дополнительной информации: https://wiki.python.org/moin/boost.python – jornb87

0

Что относительно Boost.Python?

Почему вы не хотите использовать SWIG?

+0

У меня нет ничего против SWIG, я просто сказал, что мне не нужен ответ: «Вот X-страница для загрузки/документации, удачи!» Я хочу «Вот X-библиотека/инструмент, вот как вы выставляете данный исходный код, и это пример кода Python/Ruby, который обращается к« Foo :: pushBack (const int & newInt) ». (О Boost.Python) Я пытался использовать библиотеки Boost, но я никогда не могу использовать библиотеки, которые нуждаются в создании (например, библиотеки Python). – bboy3577

+0

@ bboy3577 посмотрю. Ну, я никогда не использовал Boost.Python, и я не использовал SWIG в годах, поэтому я не могу предоставить ничего больше, чем примеры в документации. В документации Boost.Python есть несколько хороших примеров. В ответе jornb87 есть примеры кода. –

+0

@ bboy3577 Кроме того, когда вы говорите: я не хочу отвечать, что «вот страница загрузки/документации X, удачи!» Я хочу «Вот X-библиотека/инструмент, вот как вы выставляете данный исходный код, и это пример кода Python/Ruby, который обращается к Foo :: pushBack (const int & newInt)» Кажется, что вы хотите других людей работать для вас. Это намного более благоприятно для людей, чтобы помочь вам, если вы продемонстрируете, что вы пытались использовать в SWIG/Boost.Python, и об ошибке, имеющейся у вас, и о том, что вы пытались ее исправить. –

 Смежные вопросы

  • Нет связанных вопросов^_^