Я строю расширение ruby на языке C++. У меня есть несколько конструкторов в C++. поэтому я создал несколько методов инициализации. но он показывает ошибку. Спасибо.Несколько конструкторов в расширении Ruby C++
вот мой код.
заголовочный файл C++
#ifndef CIRCLE_H_
#define CIRCLE_H_
class Circle {
public:
Circle():_radius(0.0) {}
Circle(float radius):_radius(radius) {}
float getArea() { return 3.14159 * _radius * _radius; }
void setRadius(float radius) { _radius=radius; }
private:
float _radius;
};
#endif /* CIRCLE_H_ */
CPP файл
#include<ruby.h>
#include"Circle.h"
#include<iostream>
using namespace std;
VALUE classOb;
template<class Obtype> void delete_objects(Obtype *ptr){// free pointer
delete ptr;
}
template<class Obtype> VALUE wrap_pointer(VALUE klass,Obtype *ptr){ //wrap c++ object to ruby object
return Data_Wrap_Struct(klass,0,delete_objects,ptr);
}
VALUE alloc_ob(VALUE self){
return wrap_pointer<Circle>(self,new Circle());// add c++ object to ruby object
}
VALUE method_initialize(VALUE self,VALUE y){
double x= NUM2DBL(y);
Circle *c;
Data_Get_Struct(self,Circle,c);
c->setRadius(x);
return self;
}
VALUE method_Initialize(VALUE self){
.......
return ;
}
............
extern "C" void Init_Test(){
VALUE lemon = rb_define_module("Test");
classOb= rb_define_class_under(lemon,"Circle",rb_cObject);
rb_define_alloc_func(classOb,alloc_ob);
rb_define_method(classOb, "initialize", (VALUE(*)(ANYARGS))method_initialize,0);
rb_define_method(classOb, "initialize", (VALUE(*)(ANYARGS))method_initialize,1);
rb_define_method(classOb, "test1", (VALUE(*)(ANYARGS))method_initialize,0);
}
extconf.rb
require 'mkmf'
have_library('stdc++');
$CFLAGS << " -Wall"
create_makefile('Test');
test.rb
require 'rubygems'
require '/home/kelum/workspace/Test3/circle/Test'
include Test
obj=Circle.new
obj2=Circle.new(7.1)
возникли ошибки
Circle.cpp:47:61: error: overloaded function with no contextual type information
Circle.cpp:48:61: error: overloaded function with no contextual type information
В чем проблема?
спасибо Нейлу, я попробую это. –
Нет проблем. Обратите внимание, что метод «заводской» метод позволит использовать ваши различные конструкторы C++, но только если вы сделаете это с помощью некоторых новых вариантов 'wrap_pointer (self, new Circle());' - я покажу это выше для сравнения. –