题目
为 Rectangle 类实现构造函数,拷贝构造函数,赋值操作符,析构函数。
class Shape {
int no;
};
class Point {
int x;
int y;
};
class Rectangle : public Shape {
int width;
int height;
Point *leftUp;
public:
Rectangle(int width,
int height,
int x,
int y);
Rectangle(const Rectangle& other);
Rectangle& operator=(const Rectangle& other);
~Rectangle();
};
- 作业要求:
一,请使用正规编码风格。
二,所有代码写在.h 和.cpp文件中,不要写在word或txt等文件中。
三,请将作业以附件上传的形式提交,请用你的Boolan账号昵称命名文件夹。
分析代码
- 首先,有一个叫 Shape 的类,这个类的值只有一个,是整型。应该是通过这个值判断是什么样的形状,比如1是矩形。
- 然后,有一个叫 Point 的类,这个类有两个值,很明显是坐标。
- 然后有个矩形的类,这个类和 Shape 有关系,不明白是什么关系。下面有宽高两个参数,还有一个指向点的指针。可以看到,构造函数和 Big Three。
开工
- 首先,Shape 这段,并没有发生问题,所以不管也没有关系。
class Shape {
public:
Shape(int n = 1) : no(n) {}
int shc() const {
return no;
}
private:
int no;
};
只是改成了更容易看的格式。
- 然后是 Point 部分,一开始还是以是 pointer,后来写代码时才反应过来,原来是点。二维空间的点和复数的写法是一样一样的。只写了类定义和赋值重载。
class Point {
public:
Point(int xx = 0, int yy = 0) : x(xx), y(yy) {}
Point operator=(const Point pt);
int getx() const {
return x;
}
int gety() const {
return y;
}
private:
int x;
int y;
};
inline Point
Point::operator=(const Point pt) {
x = pt.y;
y = pt.y;
return Point(x, y);
}
- 接下来啃这次的重点 Rectangle。首先是构造函数。
inline
Rectangle::Rectangle() {
width = 0;
height = 0;
*leftUp = Point(0, 0);
}
inline
Rectangle::Rectangle(int w, int h) {
width = w;
height = h;
*leftUp = Point(0, 0);
}
inline
Rectangle::Rectangle(int w, int h, const Point pt) {
width = w;
height = h;
*leftUp = pt;
}
一开始只写了最后一个构造函数,后来发现新建空的矩形时不方便,于是又写了前两个。
- 然后是析构函数。
inline
Rectangle::~Rectangle() {
delete leftUp;
}
一开始并不太理解为什么要 delete,后来发现是课上讲过,但是忘了。
- 最后是赋值操作符。
inline Rectangle&
Rectangle::operator=(const Rectangle& other) {
if (this == &other) return *this;
width = other.getw();
height = other.geth();
*leftUp = *other.getp();
return *this;
}
这段一开始出了大问题,表现出来的是 Point不能赋值,后来确定是*leftUp 这种形式不能复制,看了结果,发现是指针指向的地址未分配,后来搜索了一下,才发现应该用 new 新建一个空间,对应String 里面的m_data = new char[1];
,所以应该在定义 leftUp 的时候,加上 new Point()
- 最后类定义是这样的:
class Rectangle : public Shape {
public:
Rectangle(int w,
int h,
const Point pt);
Rectangle(int w,
int h);
Rectangle();
Rectangle(const Rectangle& other);
Rectangle& operator=(const Rectangle& other);
~Rectangle();
int getw() const {
return width;
}
int geth() const {
return height;
}
Point* getp() const {
return leftUp;
}
private:
int width;
int height;
Point *leftUp = new Point();
};