我構建了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())'的一些新變體來做到這一點,'' - 我會在上面進行比較。 –