我构建了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())'的一些新变体来做到这一点,'' - 我会在上面进行比较。 –