J'utilise SWIG pour encapsuler un script Ruby autour d'une bibliothèque C++. Dans Ruby, je peux hériter d'une classe C++, mais je ne peux pas passer le pointeur résultant à une fonction C++ d'une manière polymorphe.Polymorphisme à travers C++ et Ruby utilisant SWIG
Voici un exemple concret. Le fichier d'interface SWIG définit la classe Animal de base avec son fonction virtuelle():
[animals.i]
%module(directors="1") animals
%{
#include "animals.h"
%}
// Apply the 'director' feature to a virtual function,
// so that we can override it in Ruby.
%feature("director") Animal::sound;
class Animal {
public:
Animal();
virtual ~Animal();
virtual void sound();
};
class Dog : public Animal {
public:
Dog();
virtual ~Dog();
virtual void sound();
};
// This function takes an Animal* and calls its virtual function sound().
void kick(Animal*, int);
Notez que j'utilise les administrateurs SWIG pour polymorphisme interlangage, mais cela ne semble pas fonctionner. Le script Ruby ressemble à ceci:
[tst.rb]
require 'animals'
include Animals
dog= Dog.new # Instantiate C++ class
kick(dog, 3) # Kick the dog 3 times => It barks 3 times.
# So far so good.
class Cat < Animal # Inherit from a C++ class
def initialize
puts "Creating new cat"
end
def sound
puts "Meow"
end
end
cat= Cat.new # Instantiate Ruby class
kick(cat, 9) # This does not fly.
La dernière ligne dans le script produit cette erreur:
Expected argument 0 of type Animal *, but got Cat #<Cat:0xb7d621c8>
donc en quelque sorte SWIG ne me permet pas de traiter l'objet Ruby comme un pointeur à des animaux . Des idées?
Merci l'homme! Vraiment, si 'super()' n'est pas appelé à partir de la méthode 'initialize()' écrasée, alors l'erreur 'ObjectPreviouslyDeleted' est transmise lors du passage de Ruby à C++. – user1763487