【问题标题】:Object Construction in C++C++ 中的对象构造
【发布时间】:2012-02-09 15:51:38
【问题描述】:

我正在使用 C++ 编写一个小项目,该项目需要我创建一个自定义类的对象,该类是我在另一个类中编写的。该类名为FIRFilterModule,它有一个简单的空白构造函数。

作为一个java背景,我的冲动是这样创建的:

class SensorInput{
public:

  FIRFilterModule firFilter;
  ...More Class Members...
  SensorInput():firFilter(FIRFilterModule()){}
...};

但是,这与“此上下文中的错误”这一非常有用的错误消息一起编译。我有点迷失为什么这不起作用。增加了我的困惑,我将代码更改为:

class SensorInput{
public:

  FIRFilterModule firFilter;
  ...More Class Members...
  SensorInput(){}
...};

有效。

谁能帮我理解为什么会这样?

【问题讨论】:

  • 如上所述,FIRFilterModule 是我编写的一个类,具有公共构造函数。 firFilter 是我在 SensorInput 中创建的对象。那是我得到的完整错误。我使用的编译器是风河的默认编译器

标签: c++ object constructor c++11


【解决方案1】:

在这种特殊情况下,为成员字段运行默认构造函数,您无需执行任何操作。构造函数自动运行。所以你可以写

class SensorInput{
public:

  FIRFilterModule firFilter;

  SensorInput() { ... }
};

只有在需要调用有参数的构造函数或初始化 POD 类型时才需要成员初始化列表。例如,假设FIRFilterModule 有一个构造函数,它采用int。然后你会使用成员初始化列表

SensorInput() : firFilter(42) { ... }

【讨论】:

  • “你不需要做任何事情”
  • 这适用于在任何地方构建 FIRFilterModule 吗?比如说我在我的 int main() 中创建了一个。
  • @jozefg 是的。它适用于声明FIRFilterModule 实例的任何地方。请注意,这与说 FIRFilterModule* 不同
  • "只有在需要调用有参数的构造函数时才需要成员初始化列表。" 或者初始化POD类型,否则会保持未初始化状态。
【解决方案2】:

The code you posted is correct.

也许您忘记包含声明 FIRFilterModule 的标头。

否则,一切都应该正常。

【讨论】:

  • 对不起,但不...我包括了所有内容并三重检查了 FIRFilterModule。我也请其他人查看我的代码,错误肯定在那个代码 sn-p 中。
  • @jozefg 如果它在那个 sn-p 中,请复制我在您的编译器中发布的代码并尝试一下。如果它不工作,你的编译器是错误的。
  • @jozefg 或者它只是告诉你初始化是没有意义的,正如 JaredPar 提到的那样。
  • @AlanStokes 是的,我后来对此发表了评论并称赞了 JaredPar。
  • 是的,我的编译器很奇怪。这似乎是错误的根源。
猜你喜欢
  • 2017-02-22
  • 2010-10-25
  • 2011-02-20
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
相关资源
最近更新 更多