将Ref对象作为类成员

时间:2018-11-05 15:52:28

标签: c++ memory-management reference eigen

我希望通过引用将我的数据传递给一个类,在该类中,引用本身应为公共变量,以供成员函数访问。如果我声明了我的班级及其构造函数

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){}

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

根据我的研究,我从question

中发现了这一点
  

如果要重新分配Ref来引用另一个缓冲区,请使用new放置重新调用Ref的构造函数。不要忘记先调用析构函数。

我相信这可能有助于回答我的问题,但是我不知道这些指示在实践中将意味着什么,因此在这里是我的问题。具体来说,我想我正在创建Ref对象的新实例来传递所传递的引用。有人可以帮我解释这个问题的答案,还是可以建议一种更优雅的方法,在其他地方创建源数据(例如通过main从文件中读取)时在类中使用Ref对象?

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

  

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

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

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) ) {}
   ...
};

通常在类中具有引用不是一个好主意,首先,您需要小心不要悬挂参考,其次-如果您决定允许复制和/或分配对象,则会遇到麻烦。

答案 1 :(得分:1)

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

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

您可能想使用非const引用:

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

至少您会获得当地裁判。

答案 2 :(得分:0)

您可以使用初始化列表:

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

答案 3 :(得分:0)

您可以像这样设置和访问参考:

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

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

如果需要此功能,则必须将成员变量更改为指针,然后可以轻松更改指针。而且,如果您不希望类的用户必须使用指针,则可以添加一个返回引用的方法。

如果实现指针解决​​方案,请记住,只要anypody尝试使用您的max_likelihood类访问原始对象,该原始对象就必须保留。也许您应该使用std::shared_ptr<>来防止内存泄漏。