本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解原型模式的动机,掌握该模式的结构;
2、能够利用原型模式解决实际问题。
[实验任务一]:向量的原型
用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。
实验要求:
1.画出对应的类图;
2.提交源代码(用C++完成);
3.注意编程规范。
1、类图
2、
2、源代码
#include <iostream>
#include <cstring>
class Vector {
private:
int* data;
size_t length;
public:
// 构造函数
Vector(size_t len) : length(len) {
data = new int[length];
for (size_t i = 0; i < length; ++i) {
data[i] = 0; // 初始化为0
}
}
// 析构函数
~Vector() {
delete[] data;
}
// 深克隆
Vector* deepClone() const {
Vector* newVector = new Vector(length);
for (size_t i = 0; i < length; ++i) {
newVector->data[i] = data[i]; // 复制数据
}
return newVector;
}
// 浅克隆
Vector* shallowClone() const {
return new Vector(*this); // 直接复制对象
}
// 设置向量值
void setValue(size_t index, int value) {
if (index < length) {
data[index] = value;
}
}
// 获取向量值
int getValue(size_t index) const {
return (index < length) ? data[index] : 0;
}
// 打印向量
void print() const {
for (size_t i = 0; i < length; ++i) {
std::cout << data[i] << " ";
}
std::cout << std::endl;
}
};
int main() {
Vector vec1(5);
vec1.setValue(0, 1);
vec1.setValue(1, 2);
vec1.setValue(2, 3);
vec1.setValue(3, 4);
vec1.setValue(4, 5);
std::cout << "原始向量: ";
vec1.print();
// 深克隆
Vector* deepCloneVec = vec1.deepClone();
deepCloneVec->setValue(0, 10); // 修改深克隆对象
std::cout << "深克隆向量: ";
deepCloneVec->print();
// 浅克隆
Vector* shallowCloneVec = vec1.shallowClone();
shallowCloneVec->setValue(0, 20); // 修改浅克隆对象
std::cout << "浅克隆向量: ";
shallowCloneVec->print();
// 清理动态分配的内存
delete deepCloneVec;
delete shallowCloneVec;
return 0;
}
3、运行截图
4、比较
深克隆:安全,修改克隆对象不会影响原对象,代价是内存使用增加。
浅克隆:效率高,节省内存,但可能导致意外的修改,因为多个对象共享相同的内存。