我如何在一个类中声明一个对象,该对象在其构造函数中需要另一个?

时间:2019-05-15 11:55:58

标签: c++

我想在类的私有部分中声明来自两个不同类的两个对象。我的问题是第二个对象应该在构造函数中使用第一个对象。这是我的班级私人节的示例:

class FactorGraph
{
private:
    gtsam::ISAM2Params _parameters();
    gtsam::ISAM2 _isam(_parameters);

应该将_parameters对象作为_isam对象的参数传递,但是据我所知这是不可能的,因为C ++不允许这样做。有一种巧妙的方法吗?

1 个答案:

答案 0 :(得分:4)

初始化构造函数中的第二个对象(或同时初始化两者):

FactorGraph::FactorGraph()
    : _parameters{}, _isam{_parameters}
{ }

初始化按照类中列出成员的顺序进行(无论此list(!)的顺序如何,因此在此处保持相同的顺序是一个好主意,否则编译器甚至会警告您),这可以保证_isam不会得到未初始化的任何内容。 (如果您只是在类声明中定义对象,我就不会意识到这种保证。)

在评论中,谢谢@drescherjm:在您的类中,只需声明您的对象不使用初始化程序

class FactorGraph
{
private:
    gtsam::ISAM2Params _parameters;
    gtsam::ISAM2 _isam;

当您声明它们没有初始化程序时,应该在构造函数中对其进行初始化。为此,它们不需要默认可构造,对象只初始化一次(在构造函数中)

然后,如果您有更多的构造函数,请不要忘记在任何地方都进行此操作,或者继续进行下去:

FactorGraph(int) : FactorGraph{}, /* other initializers */ { }