C++ 使用Rcpp公开以对象指针作为参数的构造函数
我有以下非常简单的代码,它定义了一个类B,将指向类a对象的指针作为参数 <> >如果我把它编译成独立的C++,代码就可以工作得很好,但是我不能用RCPP来公开类B。我一定是在靠近末尾的C++ 使用Rcpp公开以对象指针作为参数的构造函数,c++,oop,rcpp,C++,Oop,Rcpp,我有以下非常简单的代码,它定义了一个类B,将指向类a对象的指针作为参数 >如果我把它编译成独立的C++,代码就可以工作得很好,但是我不能用RCPP来公开类B。我一定是在靠近末尾的.constructor()行中做错了什么。尝试了&、*、等的所有组合,但没有任何效果。经过几个小时的努力,我迷路了。欢迎提出任何意见 #include <Rcpp.h> using namespace Rcpp; class A { public: A(int val_) { val = val_
.constructor()
行中做错了什么。尝试了&、*、等的所有组合,但没有任何效果。经过几个小时的努力,我迷路了。欢迎提出任何意见
#include <Rcpp.h>
using namespace Rcpp;
class A {
public:
A(int val_) { val = val_; }
int val;
};
class B {
public:
B(A& ptr_) { ptr = &ptr_; }
int getval() { return (this->ptr->val); }
A *ptr;
};
RCPP_MODULE(module_cpp) {
using namespace Rcpp;
class_<A>("A")
.constructor<int>()
.field("val", &A::val)
;
class_<B>("B")
.constructor<A>()
;
}
#包括
使用名称空间Rcpp;
甲级{
公众:
A(int val_u2;){val=val_2;;}
int-val;
};
B类{
公众:
B(A&ptr){ptr=&ptr}
int getval(){return(this->ptr->val);}
A*ptr;
};
RCPP\U模块(模块cpp){
使用名称空间Rcpp;
甲级
.constructor()
.field(“val”,&A::val)
;
B类
.constructor()
;
}
让我们试着固执一点:您的B
构造函数期望引用a
,因此我们应该将其公开,即.constructor()
。这样我就得到了错误
从'SEXP'{aka'SEXPREC*'}到'A&'的用户定义转换无效。
基本上,我们希望在R中创建一些可调用的东西(B的构造函数),但是我们只能使用SEXP作为参数的类型。目前还不知道如何在SEXP
和A&
之间转换。这种转换将是Rcpp::as
(反面是Rcpp::wrap
)的任务,这在Rcpp扩展小插图中有介绍。对于Rcpp模块,我们可以使用Rcpp模块小插图中的Rcpp\u EXPOSED\u和friends,c.f.第2.2.11节提供的快捷方式
下面是添加了验证代码的完整示例:
#包括
使用名称空间Rcpp;
甲级{
公众:
A(int val_u2;){val=val_2;;}
int-val;
};
B类{
公众:
B(A&ptr){ptr=&ptr}
int getval(){return(this->ptr->val);}
A*ptr;
};
RCPP_暴露为(A);
RCPP\U模块(模块cpp){
使用名称空间Rcpp;
甲级
.constructor()
.field(“val”,&A::val)
;
B类
.constructor()
.method(“getVal”,&B::getVal)
;
}
/***R
a$getVal()
[1] 42
我想了很久,但你确定我们允许这样继承吗?我认为大多数Rcpp模块使用更简单,只做一个层(可能像我在Rcpp烦恼中做的那样模板化)。@DirkEddelbuettel:我还没有看到Rcpp的例子,但这是对象的常见用法。例如,A可以是一个城市,B可以是一个人。然后你可以问这样的问题:“这个人居住的城市的温度是多少?”。B不是从A继承的,只是有一个指向A的指针。Rcpp画廊写文章来保存它/给它更多的曝光率?@Dirk。我刚刚意识到我以前写过好几次关于RCPP\u EXPOSED.*
。为画廊写这篇文章是有道理的。让我们看看我是否能找到一些激励的例子。。。