原型模式

实验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.注意编程规范。

posted @ 2024-12-30 22:24  chrisrmas、  阅读(6)  评论(0)    收藏  举报