将 Ref 对象作为 class 成员

Having Ref object as class member

我希望通过引用将我的数据传递给 class,其中引用本身应该是 public 变量,以供成员函数访问。如果我声明我的 class 及其构造函数

class max_likelihood { 
public: 
MatrixXd dat
max_likelihood(const Ref<const MatrixXd>& dat_in)
{dat = dat_in;}

我得到了运行代码,但最终创建了 dat 的副本,我想避免这种情况。

我尝试改为:

class max_likelihood {
public:
const Ref<const MatrixXd>& dat;
max_likelihood(const Ref<const MatrixXd>& dat){}

但这不起作用 and/or 不允许我访问对 dat 的引用,甚至无法编译。

根据我的研究,我从

中找到了这一点

if you want to reassign a Ref to reference another buffer, then use a placement new to re-call the constructor of Ref. Don't forget to call the destructor first.

我相信这可能有助于回答我的问题,但我不知道这些说明在实践中意味着什么,因此我的问题在这里。具体来说,我想我正在创建一个 Ref 对象的新实例来传递传递的引用。当在其他地方创建源数据时,我如何解释这个问题的答案或找到一种更优雅的方式来使用 classes 中的 Ref 对象,比如通过 main 从文件中读入?

您可以使用初始化列表:

struct max_likelihood { 
    MatrixXd& dat
    max_likelihood(MatrixXd& dat_in) : dat(dat_in) {}
};

成员变量dat是const引用,需要初始化

max_likelihood(const Ref<const MatrixXd>& argdat):dat(argdat){}

您可能想改用非常量引用:

class max_likelihood {
public:
Ref<const MatrixXd> dat;
max_likelihood(const Ref<const MatrixXd>& dat):dat(argdat){}

至少你得到了一个本地参考。

I get functioning code but end up creating a copy of dat, which I would like to avoid.

在这种情况下使用引用来避免数据复制是一个糟糕的主意,在 class 中维护引用会使事情变得非常复杂。因此,如果 MatrixXd 为 C++11 或更高版本正确设计,只需使用移动语义:

class max_likelihood { 
public: 
   MatrixXd dat;
   max_likelihood(MatrixXd dat_in) : dat( std::move(dat_in) ) {}
   ...
};

如果不动态分配它并转移所有权:

class max_likelihood {  
public: 
   std::unique_ptr<MatrixXd> dat;
   max_likelihood(std::unique_ptr<MatrixXd> dat_in) : dat( std::move(dat_in) ) {}
   ...
};

通常在 class 中引用不是一个好主意,首先你需要小心不要得到悬空引用,其次 - 如果你决定允许你的对象是已复制 and/or 已分配。

您可以像这样设置和访问引用:

class max_likelihood {
public:
   max_likelihood( const MatrixXd& input_dat): dat(input_dat) { }
   const MatrixXd& dat;
};

但您不能更改引用,即将其重新分配给另一个对象进行引用。

如果你需要这个功能,那么你就得把成员变量改成指针,这样就可以很方便的改指针了。如果您不希望 class 的用户必须使用指针,您可以添加一个 returns 引用的方法。

如果您实施指针解决方案,请记住,只要任何人尝试使用您访问它,原始对象就必须持续存在 max_likelihood class。也许你应该使用 std::shared_ptr<> 来防止内存泄漏。