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

问题描述 投票:2回答:1

我有下面这段非常简单的代码,它定义了一个类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>()
    ;
}
c++ oop rcpp
1个回答
6
投票

让我们试着固执一点。你的构造函数 B 期待一个对 A所以,我们应该把它揭露出来,即。.constructor<A&>(). 这样做,我得到的错误是

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

基本上,我们想在R中创建一些可被调用的东西(R中的 B),但我们只能使用 SEXP 作为参数的类型。而目前还不知道如何在 SEXPA&. 这类转换的任务是 Rcpp::as (和 Rcpp::wrap 反之),这些内容在Rcpp扩展小节中都有介绍。对于Rcpp模块,我们可以采用由 RCPP_EXPOSED_AS and friends, c.f. section 2.2.11 in Rcpp-modules vignette.

这里有一个完整的例子,并添加了验证代码。

#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()
*/ 

输出:

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

> a <- new(A, 42)

> b <- new(B, a)

> b$getVal()
[1] 42
© www.soinside.com 2019 - 2024. All rights reserved.