3

我试图在 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_ ) ) {}

希望这最终能帮助其他人!

4

1 回答 1

1

根据上面的编辑,“内部”复制构造函数和“容器”构造函数发现了问题,以及原始 RCPP_MODULE 宏调用的一些小问题。

于 2013-09-17T20:08:58.063 回答