使用 Rcpp 公开一个构造函数,该构造函数将指向对象的指针作为参数

sca*_*che 3 c++ oop rcpp

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

如果我将其编译为独立的 C++,该代码可以完美运行,但我无法使用 Rcpp 公开 B 类。我一定是在快要.constructor<A>()结束的时候做错了什么。尝试了 &、* 等的所有组合,但没有任何效果。经过几个小时的尝试,我迷路了。欢迎任何想法。

#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>()
    ;
}
Run Code Online (Sandbox Code Playgroud)

Ral*_*ner 6

让我们试着顽固一点:您的构造函数 forB需要对 an 的引用A,因此我们应该将其公开,即.constructor<A&>(). 这样做我得到了错误

invalid user-defined conversion from ‘SEXP’ {aka ‘SEXPREC*’} to ‘A&’

基本上我们想创建一些可以在 R 中调用的东西(用于 的构造函数B),但我们只能将其SEXP用作参数的类型。目前尚不清楚如何在SEXP和之间进行转换A&。这种转换将是Rcpp::as(以及Rcpp::wrap相反)的任务,这在 Rcpp 扩展小插图中进行了介绍。对于 Rcpp 模块,我们可以使用RCPP_EXPOSED_AS和朋友提供的快捷方式,参见 Rcpp-modules 小插图中的第 2.2.11 节。

这是一个添加了验证码的完整示例:

#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_EXPOSED_AS(A);

RCPP_MODULE(module_cpp) {
    using namespace Rcpp;

    class_<A>("A")
        .constructor<int>()
        .field("val", &A::val)
    ;

    class_<B>("B")
        .constructor<A&>()
        .method("getVal", &B::getval)
    ;
}

/***R
a <- new(A, 42)
b <- new(B, a)
b$getVal()
*/ 
Run Code Online (Sandbox Code Playgroud)

输出:

> Rcpp::sourceCpp('61898230.cpp')

> a <- new(A, 42)

> b <- new(B, a)

> b$getVal()
[1] 42
Run Code Online (Sandbox Code Playgroud)