我希望通过引用将我的数据传递给一个类,在该类中,引用本身应为公共变量,以供成员函数访问。如果我声明了我的班级及其构造函数
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
对象?
任何帮助将不胜感激。
答案 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<>
来防止内存泄漏。