On Tue, 20 Jun 2000, Yukihiro Matsumoto wrote:

> Hi,
>
Hi and thanks for the prompt reply.

> In message "[ruby-talk:03532] Extension in C++?"
>     on 00/06/20, Robert Feldt <feldt / ce.chalmers.se> writes:
> 
> |Extending Ruby in C is simple and pretty straightforward. I'm considering
> |putting together an extension based on some C++ classes I have. Do I have
> |to take any special measures to interface C++ and Ruby as compared to Ruby
> |and C? Would it, for example, work to Wrap_Struct(class MyCppClass)
> |directly or is there other ways? Can extconf and mkmf handle cpp
> |files? Anyone done this and have some sample code?
> 
> There's no difference between C and C++ in writing extension, except
> you have to wrap initialize function (Init_xxx) by extern "C".
> 
When I make the file below gcc won't compile it since ANSI C++ does not 
allow pointer conversion. I guess one solution is to turn the ANSI C++
standard off but I'm not sure that's a good solution (or how you do it!).
Am I missing something? Should you do this in some other way? If some
compiler option will do the trick maybe mkmf-funcs should sense the use of
c++ and add the compiler options automagically? Sorry if this is
obvious...

------------rubycpp.cpp -----------------
#include <ruby.h>

class Func {
public:
  int f(int x) { return 2*x; }
};

VALUE cFunc;

static void rbcpp_free(Func* obj) {
  delete obj;
}

static VALUE rbcpp_init(VALUE self) {
  Func* new_obj = new Func;
  return Data_Wrap_Struct(cFunc, 0, rbcpp_free, new_obj);
}

static VALUE rbcpp_f(VALUE self, VALUE x) {
  Func* obj;
  Data_Get_Struct(self, class Func, obj);
  return INT2NUM(obj->f(NUM2INT(x)));
}

extern "C" void Init_rubycpp() {
  cFunc = rb_define_class("Func", rb_cObject);
  rb_define_method(cFunc, "f", rbcpp_f, 1);
  rb_define_method(cFunc, "initialize", rbcpp_init, 0);
}
--------------------------------------------

Regards,

Robert

Ps. Compiler output:

gcc -DUSEIMPORTLIB -I/usr/local/lib/ruby/1.4/i686-cygwin -g -O2
-I/usr/local/include    -c rubycpp.cpp -o rubycpp.o
rubycpp.cpp: In function `VALUE rbcpp_init(long unsigned int)':
rubycpp.cpp:16: ANSI C++ prohibits conversion from `(Func *)' to `(...)'
rubycpp.cpp: In function `void Init_rubycpp(...)':
rubycpp.cpp:27: ANSI C++ prohibits conversion from `(long unsigned int,
long uns
igned int)' to `(...)'
rubycpp.cpp:28: ANSI C++ prohibits conversion from `(long unsigned int)'
to `(..
.)'
make: *** [rubycpp.o] Error 1
bash-2.04$