在 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 的两个实例,为xy 提供所需的值,例如

#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 个双精度浮点加法工具?

在 Oracle 中创建视图时更改列精度

glm::vec3 精度 C++

如何在 C++ 中创建和初始化双精度的 SAFEARRAY 以传递给 C#

如何在 MATLAB MEX 文件中创建双精度的 N-D 矩阵?