【问题标题】:c++ float passed as argument not printed correctly作为参数传递的 c++ 浮点数未正确打印
【发布时间】:2016-04-30 03:17:30
【问题描述】:

我真的是 C++ 新手。我有一个简单的控制台应用程序,其中包含一个 header.h 来保存我的课程

class MyClass
{
public:
    float x, y, z;

    MyClass(float x, float y, float z);
};

我有一个implement.cpp,其中包含我所有已实现的方法,而且我有

MyClass::MyClass(float x, float y, float z) {};

然后在 main.cpp 我尝试简单地打印值

int main()
{
  MyClass One(-3.0f, 0.0f, 4.0f);

  cout <<  "Firsth Object: " << One.x << ", " << One.y << ", " << One.z << endl;
}

但在控制台中的值打印如下:

-1.07374e+08, -1.07374e+08, -1.07374e+08

我做错了什么?

【问题讨论】:

  • 你的构造函数有什么用?
  • 您不应将文件称为“header.h”和“implement.cpp”,而应将其称为“MyClass.h”和“MyClass.cpp”
  • @MarkusWeninger:只有在您选择了类和标头/源对的一对一映射时才适用,但情况并非总是如此。
  • @LightnessRacesinOrbit 你是对的,但是对于这种情况,在标头和实现之间存在 1:1 映射的情况下,我更喜欢使用相同的文件名。
  • @MarkusWeninger:你不知道选择了 1:1 映射。

标签: c++


【解决方案1】:

您的构造函数没有初始化任何成员:MyClass::xMyClass::yMyClass::z

你必须这样做:

MyClass::MyClass(float x, float y, float z)
{
    this->x = x;
    this->y = y;
    this->z = z;
};

或更好(更惯用,可能更快):

MyClass::MyClass(float x, float y, float z) : 
    x( x ), y( y ), z( z )
{
};

否则,您将打印MyClass 对象One 的未初始化成员的值。一般来说,您必须先always initialize members of a class 才能使用它们。

【讨论】:

  • 转 MyClass::MyClass(float x, float y, float z) {};进入 MyClass::MyClass(float x, float y, float z) : x(x), y(y), z(z) {};
  • 真的谢谢你。正如我所说,我真的是一个初学者。这是什么意思->​​?
  • 仅供参考,您不需要为初始化列表中的参数使用不同的名称,并且以_ 开头的变量由标准规范保留。
  • 没有必要用_前缀重命名参数,在这种情况下编译器足够聪明,可以区分类成员和函数参数。
  • 嗯,对不起,我完全只是在你的答案上强加了相同的变量名。我同意 Galik 和 Victor 的观点,这是完全没有必要的,而且会损害可读性。但是如果你坚持要修改名字,为什么不修改私有成员,而不是形式参数呢?
【解决方案2】:

你当前的构造函数什么都不做。

你必须初始化你的 objects 变量。为此,您可以使用

MyClass::MyClass(float x, float y, float z) : x(x), y(y), z(z) 
{
}

构造函数中的这种类型的初始化称为initializer list,你可以阅读它here

这和@jpo38指出的构造函数效果一样。

【讨论】:

  • 这个答案重复了另一个,只是稍作修正。值得为jpo38 的答案添加评论。
  • 好的,那我应该删除答案吗?我对在 SO 上编写分析器很陌生。
  • 我认为是的,因为人们通常应该添加具有显着差异的答案。如果您只是对另一个答案进行了更正 - 只需添加评论即可,无需复制答案。
  • 但我认为这很大的不同,因为大多数其他语言都没有initializer list这样的结构。我来自 C# 和 Java,我很惊讶这样的事情是可能的。
  • @VictorPolevoy:这显着的不同。
猜你喜欢
  • 1970-01-01
  • 2020-11-11
  • 2016-02-23
  • 1970-01-01
  • 2017-03-22
  • 2014-07-21
  • 2020-07-13
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多