【问题标题】:How can I declare an object in a class, that needs another in its constructor?如何在类中声明一个对象,它的构造函数中需要另一个对象?
【发布时间】:2019-05-15 11:55:58
【问题描述】:

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

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

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

【问题讨论】:

  • 在你的类的构造函数中初始化它们。
  • @drescherjm 当我初始化它们时,它们会简单地成为私有成员吗?
  • 你把它们放在私人部分。所以它们是私有的。
  • gtsam::ISAM2Params _parameters(); 不是一个成员对象,它是一个成员函数,它不接受任何参数并返回一个gtsam::ISAM2Params
  • 您可能想了解统一初始化。

标签: c++


【解决方案1】:

在构造函数中初始化你的第二个对象(或者两者都更好):

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

初始化按照成员在类中列出的顺序进行(不管这个列表的顺序(!),所以在这里保持相同的顺序是个好主意,否则你的编译器甚至可能会警告你),这保证_isam 不会得到任何未初始化的东西。 (如果你只是在你的类声明中定义你的对象,我不知道这样的保证。)

来自 cmets,感谢 @drescherjm:在你的类中,只需声明你的对象没有初始化器

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

当你在没有初始化的情况下声明它们时,它们应该在构造函数中被初始化。为了做到这一点,它们不需要是默认可构造的,对象只被初始化一次(在构造函数中)

如果你有更多的构造函数,不要忘记在任何地方都这样做或转发到这个:

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

【讨论】:

  • 干杯,但是在声明成员时我应该在私人部分留下什么?
  • 另外,请务必遵守声明顺序,因为无论您在构造函数中写出它们的顺序如何,类成员都是按照它们的声明顺序进行初始化的。
  • 谢谢@divinas,我在答案中提到了这一点,但更加强调了它。还要感谢@drescherjm!
  • 好的,我明白了,所以使用默认构造函数声明对象应该可以工作。初始化的时候,是不是重新声明了对象?
  • @Edmund 不,您正在初始化它。它仍然需要在此之前或之后声明,但没有初始化器。这取代了类内object{...} 的角色,并且即使对象不允许默认初始化(例如,删除默认构造函数)也可以工作(使用适当的构造函数参数)。
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多