2024/11/01
软件设计实验六
[实验任务一]:向量的原型 用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。 实验要求: 1. 画出对应的类图; 2. 提交源代码(用C++完成); #include<iostream> #include <cstring> using namespace std; class Vector { public: // 默认构造函数 Vector() : size(0), data(NULL) {} // 带参数的构造函数 Vector(int s) : size(s) { data = new int[size](); } // 拷贝构造函数(用于深克隆) Vector(const Vector &v) { size = v.size; data = new int[size]; std::memcpy(data, v.data, size * sizeof(int)); } // 克隆方法(原型模式) Vector* clone() const { return new Vector(*this); // 调用深克隆的拷贝构造函数 } // 析构函数 ~Vector() { delete[] data; } // 动态改变向量大小 void resize(int newSize) { int* newData = new int[newSize](); //复制最小的元素数量 int minSize = (newSize < size) ? newSize : size; memcpy(newData, data, minSize * sizeof(int)); delete[] data; //释放旧内存 data = newData; size = newSize; } // 设置值 void set(int index, int value) { if (index >=0 && index < size) { data[index] = value; } } // 输出向量 void print() const { for (int i =0; i < size; ++i) { cout << data[i] << " "; } cout << endl; } private: int* data; // 数据指针 int size; // 向量的大小 }; int main() { Vector v1(5); for (int i =0; i <5; ++i) { v1.set(i, i +1); // 设置值为1,2,3,4,5 } cout << "原始向量 v1: "; v1.print(); // 使用原型模式进行克隆 Vector* v2 = v1.clone(); // 深克隆 cout << "克隆向量 v2(原型模式): "; v2->print(); // 修改 v2 不影响 v1 v2->set(0,10); cout << "修改 v2之后,v1仍然是: "; v1.print(); cout << "修改后的 v2: "; v2->print(); //释放内存 delete v2; return 0; }