У меня есть класс C++, который хранит необработанный указатель на объекты своего рода в качестве переменной-члена. Класс отображается через Rcpp-модули в R. Я хотел бы вернуть ссылку на переменную-член через свойство. Однако кажется, что копия возвращается.Модули Rcpp: Возвращение ссылки на объект-переменную C++-объект на R
Это также относится и к другим случаям, когда переменные объекты разных членов возвращаются к R.
Минимального воспроизводимый пример
создать новый пакет скелета с помощью Rcpp::Rcpp.package.skeleton('testmod', module = TRUE)
и добавил свой собственный класс Foo
, подвергая его к R. Пример можно найти here на github.
Содержание Src/foo.cpp:
#include <Rcpp.h>
class Foo;
RCPP_EXPOSED_CLASS(Foo)
class Foo
{
public:
Foo():
ancestor_ptr(NULL){}
Foo(const Foo& ancestor):
ancestor_ptr(&ancestor){}
const Foo& get_ancestor() {return *ancestor_ptr;}
const Foo* ancestor_ptr;
};
RCPP_MODULE(mymodule){
using namespace Rcpp ;
class_<Foo>("Foo")
.default_constructor()
.constructor<const Foo&>()
.property("ancestor", &Foo::get_ancestor)
;
}
Тестирование в R сессии дает мне:
>library(testmod)
>a <- new(Foo)
>b <- new(Foo, a)
>a
C++ object <0x1c57108> of class 'Foo' <0x22d78b0>
>b$ancestor
C++ object <0x1f8ffa0> of class 'Foo' <0x22d78b0>
Так 0x1c57108 != 0x1f8ffa0
, и я проверил с вспомогательными функциями, не показали, что 0x1c57108 на самом деле адрес объекта a
.
EDIT Я только что проверил с помощью UUID переменной-члена и пользовательского конструктора копии, которые делаются на самом деле копии объектов-членов.
Я не уверен, что делаю то же самое предположение, что и вам, что это должно сработать. Более простой подход может быть первым классом C++ с указателями на другие экземпляры. Вы сами управляете этой памятью, которая представляет собой простое приложение на C++. Затем вы используете один класс на основе Rcpp для доступа к этой новой структуре. –
@DirkEddelbuettel Итак, вы имеете в виду, что это может быть невозможно? Мне интересно, в каком месте сделана копия. С вашим предложением вы хотите использовать класс контроллера, который функционирует как дескриптор для управления всем приложением из R? Тем не менее, возвращение ссылок было бы действительно хорошей вещью, поскольку это позволило бы реализовать/прототипировать некоторые функции в R. – NoBackingDown