我试图在 Rcpp 的帮助下将我用 R 的 ReferenceClasses 编写的离散事件模拟移植到 C++。根据访问或修改内部数据和其他特征的需要,我以前将我的代码组织成各种类。以前,我成功地使用 ReferenceClasses 将这些子类组织成单元级数据,然后使用另一个 ReferenceClass 来包含模拟中所有对象的列表。
我用 Rcpp 创建基类没有问题,但是一旦我开始创建一个容器类,它使用子类元素的构造函数,我的 R 实例开始崩溃。然后我尝试使容器类成员成为一个指针,它减少了编译器遇到的问题数量,但仍然无法正常工作。我不知道接下来要做什么...
这是一个现在不适合我的代码的简短示例:
// forward declarations
class insider;
class container;
#include <Rcpp.h>
using namespace Rcpp;
class insider {
public:
NumericVector a;
NumericMatrix b;
insider( NumericVector a_, NumericMatrix b_) : a( a_ ), b( b_ ) {}
insider( const insider & i ) : a( i.a ), b( i.b ) {}
NumericVector getA() { return a; }
NumericMatrix getB() { return b; }
};
class container {
public:
insider *ins;
container(insider ins_) : ins( new insider( ins_ ) ) {}
~container() { delete ins; }
insider getInsider() { return *ins; }
};
RCPP_EXPOSED_CLASS(insider)
RCPP_EXPOSED_CLASS(container)
RCPP_MODULE(mod) {
class_<insider>("insider")
.constructor< NumericVector, NumericMatrix >()
.constructor< insider >()
.method("getA", &insider::getA)
.method("getB", &insider::getB)
;
class_<container>("container")
.constructor< insider >()
.method("getInsider", &container::getInsider)
;
}
/*** R
library(Rcpp)
insider <- mod$insider
container <- mod$container
a <- new(insider, 1:10, matrix(1:20, ncol = 2))
b <- new(container, a)
a$getA()
a$getB()
b$getInsider()$getA()
b$getInsider()$getB()
*/
编辑:
我在代码中发现了一个语法错误(现在已编辑,所以代码是最新的),现在代码可以编译并工作。与错字相协调,这使我拖了很长一段时间。
原始问题:
insider(const insider & i) {
a = i.a;
b = i.b;
}
更新为:
insider( const insider & i ) : a( i.a ), b( i.b ) {}
原来的:
container() : ins() {}
void container_insider(insider ins_) { ins = new insider; *ins = ins_; }
更新为:
container(insider ins_) : ins( new insider( ins_ ) ) {}
希望这最终能帮助其他人!