将 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<>
来防止内存泄漏。
我希望通过引用将我的数据传递给 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<>
来防止内存泄漏。