在 C++ 中创建具有 2 个双精度值的类
Posted
技术标签:
【中文标题】在 C++ 中创建具有 2 个双精度值的类【英文标题】:Creating a Class with 2 double values in C++ 【发布时间】:2019-11-09 04:08:08 【问题描述】:在 C++ 中,我试图创建一个包含两个双精度值的类 Point2D。所有数据成员和函数都应该是公开的。
对于公共成员应该有
双倍 双倍对于构造函数
默认构造函数应将 x 和 y 初始化为 0.0
Point2D(双 in_x, 双 in_y)
将 x 和 y 设置为 in_x 和 in_y对于非成员函数
void GetResult(Point2D p1, Point2D p2)
同时打印 x 和 y 值这是我目前的代码,有人可以指出我的错误吗?
Point2D.h
#ifndef POINT2D_H
#define POINT2D_H
class Point2D
public:
double x;
double y;
Point2D();
Point2D(double,double);
;
void GetResult(Point2D, Point2D);
#endif
Point2D.cpp
#include "Point2D.h"
#include <iostream>
using namespace std;
Point2D::Point2D()
x = 0.0;
y = 0.0;
Point2D::P1(double in_x, double in_y)
x = in_x;
y = in_y;
Point2D::P2(double in_x, double in_y)
x = in_x;
y = in_y;
void GetResult(Point2D P1, Point2D P2)
cout << P1.x << " " << P1.y << endl;
cout << P2.x << " " << P2.y << endl;
TestCheckPoint1.cpp
#include <iostream>
#include "Point2D.h"
using namespace std;
int main()
Point2D Point1;
Point1.x = 1.0;
Point1.y= 2.0;
Point2D Point2;
Point2.x= 1.0;
Point1.y= 2.0;
GetResult(Point1, Point2);
【问题讨论】:
问题是什么? ...如果您编译了代码并出现错误,那么错误消息是什么? (将它们附加到问题中,而不是在评论中) 不确定 P1 和 P2 函数是什么,它们看起来像是缺少构造函数的两个命名错误的副本。您可以考虑避免使用using namespace std;
【参考方案1】:
您很接近,但很明显您对重载的构造函数和声明类的实例有一些误解。对于初学者,您不需要这些功能:
Point2D::P1(double in_x, double in_y)
x = in_x;
y = in_y;
Point2D::P2(double in_x, double in_y)
x = in_x;
y = in_y;
您只需为您的 Point2D
类提供一个构造函数,该构造函数需要两个 double
值,例如
Point2D::Point2D(double in_x, double in_y)
x = in_x;
y = in_y;
然后在main()
中,您需要在调用GetResult
之前声明并初始化 默认构造类Point2D
的两个实例,为x
和y
提供所需的值,例如
#include <iostream>
#include "Point2D.h"
using namespace std;
int main()
Point2D Point1 (1.0, 2.0);
Point2D Point2 (1.0, 2.0);
GetResult(Point1, Point2);
(注意:您可以提供一个允许初始化类成员的初始化列表,请参阅Constructors and member initializer lists。您可以为您的构造函数提供一个初始化列表,例如Point2D() : x(0), y(0) ;
和重载Point2D(double, double);
。您的构造函数定义将只是Point2D::Point2D(double in_x, double in_y) : x(in_x), y(in_y)
,如果使用Point2D Point1;
创建或将x, y
设置为Point2D Point2 (1.0, 2.0);
提供的值,编译器会将x, y
初始化为0, 0
)
您在Point2D.h
的内容周围包含Header Guards 做得非常好,以防止在多个文件中包含多个包含。 Point2D
的完整头文件和源文件可能是:
#ifndef POINT2D_H
#define POINT2D_H
class Point2D
public:
double x;
double y;
Point2D();
Point2D(double,double);
;
void GetResult(Point2D, Point2D);
#endif
和
#include "Point2D.h"
#include <iostream>
using namespace std;
Point2D::Point2D()
x = 0.0;
y = 0.0;
Point2D::Point2D(double in_x, double in_y)
x = in_x;
y = in_y;
void GetResult(Point2D P1, Point2D P2)
cout << P1.x << " " << P1.y << endl;
cout << P2.x << " " << P2.y << endl;
使用/输出示例
编译运行会导致:
$ ./bin/TestCheckPoint1
1 2
1 2
注意:根本不需要在main()
中添加using namespace std;
,而且您真的不应该在任何地方包含整个标准命名空间。只需删除两个调用并将std::
添加到您的两个cout
调用和两个对endl
的调用(或者只使用'\n'
而不是std::endl;
)。见Why is “using namespace std;” considered bad practice?
改为简单地使用:
void GetResult(Point2D P1, Point2D P2)
std::cout << P1.x << " " << P1.y << '\n';
std::cout << P2.x << " " << P2.y << '\n';
查看一下,如果您还有其他问题,请告诉我。
【讨论】:
也许还指出当前双打没有被初始化。它们是默认构造的,然后分配给它们。它们应该在构造函数初始化列表中进行初始化。 在包含了initializer list的使用说明之后,从基于问题的学习角度来看,默认构造函数可能是最简单的介绍,或者说清除的方式了混乱。 C++11 初始化器列表增加了灵活性,但也增加了设置成员值的额外层复杂性。现在两者都涵盖了。 构造函数初始化列表 - 如Point2D() : x(0), y(0) ;
在 C++11 中并不新,自 C++98 以来就存在。
我只是记下:(2)在 cppreference 链接中。我不确定它什么时候出现。我从 Borland 是基于 DOS 的时候开始的……我将删除它出现时的引用。谢谢。现在我得去查一下98的介绍了。
@JesperJuhl - 你确定那个吗? Cpprefernce 很少出错,他们对Constructors and member initializer lists 的注释 (2) 清楚地说明了 C++11。在我开始回顾过去的标准之前,您有没有想过可以节省一些时间的参考资料?以上是关于在 C++ 中创建具有 2 个双精度值的类的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SSE 指令集绝对 2 个双精度或 4 个浮点数? (最高 SSE4)
为啥 C/RUST 中的一个加法计算在结果 ASM 中有 3 个双精度浮点加法工具?