Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Rcpp公开以对象指针作为参数的构造函数_C++_Oop_Rcpp - Fatal编程技术网

C++ 使用Rcpp公开以对象指针作为参数的构造函数

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_

我有以下非常简单的代码,它定义了一个类B,将指向类a对象的指针作为参数

<> >如果我把它编译成独立的C++,代码就可以工作得很好,但是我不能用RCPP来公开类B。我一定是在靠近末尾的
.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.*
。为画廊写这篇文章是有道理的。让我们看看我是否能找到一些激励的例子。。。