实验6:原型模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解原型模式的动机,掌握该模式的结构;
2、能够利用原型模式解决实际问题。
[实验任务一]:向量的原型
用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。
实验要求:
1. 画出对应的类图;
2.提交源代码(用C++完成);
#include <iostream>
#include <stdexcept>
class Vector {
private:
int size; // 向量的尺寸
double* data; // 动态分配的数组
public:
// 构造函数
Vector(int size) : size(size) {
if (size <= 0) {
throw std::invalid_argument("Size must be greater than 0.");
}
data = new double[size]; // 动态分配内存
for (int i = 0; i < size; i++) {
data[i] = 0; // 初始化为0
}
}
// 深克隆构造函数
Vector(const Vector& other) : size(other.size) {
data = new double[size]; // 分配新的内存
for (int i = 0; i < size; i++) {
data[i] = other.data[i]; // 复制内容
}
}
// 析构函数
~Vector() {
delete[] data; // 释放动态分配的内存
}
// 浅克隆赋值操作符
Vector& operator=(const Vector& other) {
if (this == &other) return *this; // 处理自我赋值
// 释放旧数据
delete[] data;
size = other.size;
data = other.data; // 共享指针(浅克隆)
return *this;
}
// 动态修改向量大小
void resize(int newSize) {
if (newSize <= 0) {
throw std::invalid_argument("Size must be greater than 0.");
}
double* newData = new double[newSize];
for (int i = 0; i < std::min(size, newSize); i++) {
newData[i] = data[i]; // 复制原数据
}
for (int i = size; i < newSize; i++) {
newData[i] = 0; // 新增元素初始化为0
}
delete[] data; // 释放旧数据
data = newData; // 更新指针
size = newSize; // 更新大小
}
// 显示向量内容
void display() const {
for (int i = 0; i < size; i++) {
std::cout << data[i] << " ";
}
std::cout << std::endl;
}
};
int main() {
try {
Vector v1(5);
v1.display();
Vector v2 = v1; // 使用深克隆
v2.resize(10);
v2.display(); // 显示v2新大小数据
v1.display(); // v1应不受影响
Vector v3(3);
v3 = v1; // 使用浅克隆
v3.display(); // 现在v3与v1共享数据
v1.resize(7); // 增加v1大小
v1.display(); // v1新数据
v3.display(); // v3会同步改变,但我们需要注意:可能会导致潜在的内存错误
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
3.注意编程规范。