本次實驗屬於模仿型實驗,透過本次實驗學生將掌握以下內容:
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、比較
深克隆:安全,修改克隆物件不會影響原物件,代價是記憶體使用增加。
淺克隆:效率高,節省記憶體,但可能導致意外的修改,因為多個物件共享相同的記憶體。