Лучший способ сделать общий класс общим для C ++ и Ruby? - PullRequest
2 голосов
/ 25 мая 2010

В настоящее время я работаю над проектом, в котором наша команда разрабатывает игру, все мы владеем ruby, а некоторые (но не все) владеют c ++. Изначально мы сделали бэкэнд в ruby, но портировали его на c ++ для большей скорости. Порт c ++ серверной части имеет те же функции и алгоритмы, что и исходный код ruby. Тем не менее, у нас все еще есть куча кода в ruby, который делает полезные вещи, но мы бы предпочли не переносить все это, поэтому мы хотим продолжать использовать код ruby ​​и получать данные из классов c ++. Это нереально? Нашей первой мыслью было, что мы можем сохранить некоторые структуры данных в формате XML или redis и назвать это, но некоторым разработчикам эта идея не нравится. Нам не нужно передавать какие-либо особенно сложные структуры данных между различными частями кода, только кортежи, строки и целые числа. Есть ли способ интегрировать код ruby, чтобы он мог вызывать вещи с ++ изначально? Нужно ли будет вставлять код? Придется ли делать рубиновое расширение? Если да, есть ли какие-нибудь хорошие ресурсы / учебные пособия, которые вы могли бы предложить?

Например, скажем, у нас есть такой код в бэкенде c ++:

class The_game{
    private:
        bool printinfo; //print the player diagnostic info at the beginning if true
        int numplayers;
        std::vector<Player*> players;
        string current_action;
        int action_is_on; // the index of the player in the players array that the action is now on

        //more code here

    public:
        Table(std::vector<Player *> in_players, std::vector<Statistics *> player_stats ,const int in_numplayers);
        ~Table();
        void play_game();
        History actions_history;

};

class History{
    private:
    int action_sequence_number;
    std::vector<Action*> recent_actions;

    public:
    void print_history();
    void add_action(Action* the_action_to_be_added);
    int get_action_sequence_number(){ return action_sequence_number;}
    bool history_actions_are_equal();
    int last_action_size(int street,int number_of_actions_ago);
    History();
    ~History();
};

Есть ли какой-нибудь способ вызвать что-то в файле actions_history через объект The_game в ruby? (Все объекты в исходном коде ruby ​​имеют одинаковые имена и функциональность)

Под этим я подразумеваю:

class MyRubyClass
  def method1(arg1)
    puts arg1
    self.f() # ... but still available
    puts cpp_method.the_current_game.actions_history.get_action_sequence_number()
  end
  # Constructor:
  def initialize(arg)
    puts "In constructor with arg #{arg}"
    #get the c++ object here and call it cpp_method
  end
end

Возможно ли это? Любые советы или предложения приветствуются.

Ответы [ 2 ]

3 голосов
/ 25 мая 2010

Вы можете использовать Ruby C API , чтобы создать расширение, которое взаимодействует с классом C ++, или SWIG до создать оболочку класса C ++ .

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

Для создания расширений ruby ​​вы также можете взглянуть на:

...