2024.10.31

设计模式实验六

软件设计                  石家庄铁道大学信息学院

 

实验6:原型模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解原型模式的动机,掌握该模式的结构;

2、能够利用原型模式解决实际问题。

 
   

 

 

[实验任务一]:向量的原型

用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。

实验要求:

1.  画出对应的类图;

 

 

2.提交源代码(用C++完成);

#include <iostream>

#include <stdexcept>

 

class Vector {

private:

    int size;       // 向量的长度

    double* data;   // 动态数组,用于存储向量的值

 

public:

    // 默认构造函数

    Vector() : size(0), data(nullptr) {}

 

    // 带参数的构造函数

    Vector(int size) : size(size) {

        if (size < 0) throw std::invalid_argument("Size must be non-negative.");

        data = new double[size];

        for (int i = 0; i < size; ++i) {

            data[i] = 0.0; // 初始化为0

        }

    }

 

    // 浅克隆构造函数

    Vector(const Vector &v) : size(v.size), data(v.data) {

        // 这里只复制了指针,未分配新的内存

    }

 

    // 深克隆

    Vector deepClone() const {

        Vector clone(size);

        for (int i = 0; i < size; ++i) {

            clone.data[i] = data[i];

        }

        return clone;

    }

 

    // 析构函数

    ~Vector() {

        delete[] data;

    }

 

    // 设置向量的值

    void set(int index, double value) {

        if (index < 0 || index >= size) {

            throw std::out_of_range("Index out of range.");

        }

        data[index] = value;

    }

 

    // 获取向量的值

    double get(int index) const {

        if (index < 0 || index >= size) {

            throw std::out_of_range("Index out of range.");

        }

        return data[index];

    }

 

    // 获取向量的大小

    int getSize() const {

        return size;

    }

 

    // 打印向量

    void print() const {

        for (int i = 0; i < size; ++i) {

            std::cout << data[i] << " ";

        }

        std::cout << std::endl;

    }

};

 

int main() {

    // 测试向量类

    Vector v1(5);

    for (int i = 0; i < 5; ++i) {

        v1.set(i, i * 1.0);

    }

 

    std::cout << "Vector v1: ";

    v1.print();

 

    // 浅克隆

    Vector v2 = v1; // 浅克隆

    std::cout << "Vector v2 (shallow copy): ";

    v2.print();

 

    // 修改v1,查看v2的变化

    v1.set(0, 100);

    std::cout << "After modifying v1, v2: ";

    v2.print(); // v2会受到影响

 

    // 深克隆

    Vector v3 = v1.deepClone();

    std::cout << "Vector v3 (deep copy): ";

    v3.print();

 

    // 修改v1,查看v3的变化

    v1.set(1, 200);

    std::cout << "After modifying v1, v3: ";

    v3.print(); // v3不会受到影响

 

    return 0;

}

3.注意编程规范。

浅克隆:

仅复制指针,新的对象与原对象共享同一块内存。

修改原对象的内容会影响到浅克隆的对象。

深克隆:

复制所有数据到新的内存区域,两个对象互不影响。

修改原对象的内容不会影响深克隆的对象。

 

posted @ 2024-12-25 10:00  cvjj  阅读(7)  评论(0)    收藏  举报