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;  
}

 

posted @ 2024-11-01 11:12  伐木工熊大  阅读(12)  评论(0)    收藏  举报