改写教材例4-2中的Point类。在Point.h中定义类的属性及成员函数声明; 在Point.cpp中实现类的成员函数;在Point_Test.cpp中测试这个类。注意多文件结构的编译、编辑方法、头文件的包含关系,观察相应的成员变量取值的变化情况。
时间: 2024-12-11 22:17:40 浏览: 9
mysql-5.7.34-1.el7.x86_64.rpm-bundle.zip
首先,在`Point.h`文件中,我们定义了一个名为`Point`的类,它包含了两个私有成员变量x和y,表示点在二维坐标系中的位置,并声明了获取和设置这些坐标的方法,以及用于计算距离的纯虚函数(因为我们需要派生类去实现具体的距离计算)。此外,还提供了一个默认构造函数和一个接受两个整数作为参数的构造函数。
```cpp
// Point.h
#ifndef _POINT_H_
#define _POINT_H_
#include <iostream>
class Point {
public:
// 构造函数
Point() : x(0), y(0) {} // 默认构造函数
Point(int x, int y) : x(x), y(y) {} // 由坐标创建点
// 成员函数声明
int getX() const; // 获取x坐标
void setX(int newX); // 设置x坐标
int getY() const; // 获取y坐标
void setY(int newY); // 设置y坐标
virtual double distanceTo(const Point& other) const = 0; // 距离计算方法(纯虚)
private:
int x;
int y;
};
#endif // _POINT_H_
```
然后,在`Point.cpp`文件中,我们实现上述声明的方法:
```cpp
// Point.cpp
#include "Point.h"
double Point::distanceTo(const Point& other) const {
return std::sqrt(std::pow(x - other.x, 2) + std::pow(y - other.y, 2));
}
int Point::getX() const { return x; }
void Point::setX(int newX) { x = newX; }
int Point::getY() const { return y; }
void Point::setY(int newY) { y = newY; }
```
接下来,在`Point_Test.cpp`文件中,我们将创建几个`Point`对象并测试它们的属性和方法:
```cpp
// Point_Test.cpp
#include "Point.h"
int main() {
Point p1; // 使用默认构造函数创建一个点
p1.setX(5);
p1.setY(10);
Point p2(15, 20); // 使用坐标创建另一个点
std::cout << "p1 coordinates: (" << p1.getX() << ", " << p1.getY() << ")\n";
std::cout << "Distance between p1 and p2: " << p1.distanceTo(p2) << "\n";
return 0;
}
```
在编译过程中,需要先分别编译`Point.cpp`和`Point_Test.cpp`(假设源代码在同一目录下),然后链接生成的`obj`文件(例如通过g++或cl编译器)。为了确保头文件之间的依赖性,记得在`Point_Test.cpp`中包含`Point.h`。
运行`Point_Test`程序,会看到不同`Point`对象的坐标以及它们之间的距离。这展示了多文件编程中如何维护类的封装性和复用性。
阅读全文