使用Rcpp对象创建的C ++类的指针

时间:2013-09-17 18:59:22

标签: c++ r rcpp

我正在尝试在Rcpp的帮助下将我用R的ReferenceClasses编写的离散事件模拟移植到C ++。我已根据访问或修改内部数据和其他特征的需要,将我的代码先前组织到各个类中。以前,我成功地使用了ReferenceClasses,它将这些子类组织成单元级数据,然后另一个ReferenceClass包含模拟中所有对象的List。

我用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_ ) ) {}

希望最终帮助其他人继续前进!

1 个答案:

答案 0 :(得分:1)

根据上面的编辑,找到了'内部'复制构造函数&amp;的问题。 'container'构造函数,以及原始RCPP_MODULE宏调用的一些小问题。