首页 > 其他分享 >原型模式

原型模式

时间:2024-12-29 20:30:23浏览次数:1  
标签:elements capacity Vector int 模式 other 原型 size

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

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

 

 #include <iostream>

#include <stdexcept>

 

class Vector {

private:

    int* elements; // 指向向量元素的指针

    size_t size;   // 当前向量中元素的数量

    size_t capacity; // 向量的最大容量

 

public:

    // 构造函数

    Vector(size_t initCapacity = 10) : size(0), capacity(initCapacity) {

        elements = new int[capacity];

    }

 

    // 析构函数

    ~Vector() {

        delete[] elements;

    }

 

    // 深拷贝构造函数

    Vector(const Vector& other) : size(other.size), capacity(other.capacity) {

        elements = new int[capacity];

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

            elements[i] = other.elements[i];

        }

    }

 

    // 浅拷贝构造函数(通常不会显式地写,这里仅为了演示)

    Vector(Vector& other, bool shallow) : size(other.size), capacity(other.capacity) {

        if (shallow) {

            elements = other.elements; // 直接复制指针

        } else {

            elements = new int[capacity];

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

                elements[i] = other.elements[i];

            }

        }

    }

 

    // 赋值运算符重载

    Vector& operator=(const Vector& other) {

        if (this != &other) { // 防止自赋值

            delete[] elements; // 清理已有的资源

            size = other.size;

            capacity = other.capacity;

            elements = new int[capacity];

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

                elements[i] = other.elements[i];

            }

        }

        return *this;

    }

 

    // 添加元素

    void push_back(int value) {

        if (size == capacity) {

            resize(capacity * 2);

        }

        elements[size++] = value;

    }

 

    // 获取或设置元素

    int& operator[](size_t index) {

        if (index >= size) throw std::out_of_range("Index out of range");

        return elements[index];

    }

 

    const int& operator[](size_t index) const {

        if (index >= size) throw std::out_of_range("Index out of range");

        return elements[index];

    }

 

    // 改变向量大小

    void resize(size_t newCapacity) {

        int* newElements = new int[newCapacity];

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

            newElements[i] = elements[i];

        }

        delete[] elements;

        elements = newElements;

        capacity = newCapacity;

    }

 

    // 获取向量大小

    size_t getSize() const {

        return size;

    }

 

    // 获取向量容量

    size_t getCapacity() const {

        return capacity;

    }

};

 

区别:

深克隆:当一个对象被复制时,不仅复制了对象本身,还复制了它所引用的所有对象。这意味着两个对象是完全独立的,修改其中一个不会影响另一个。上述代码中的拷贝构造函数默认实现了深克隆。

浅克隆:只复制对象的基本数据类型成员变量,对于引用类型的数据成员,则只是复制其引用而不复制引用的对象本身。因此,两个对象将共享同一份引用数据。这在某些情况下可能会导致未预期的行为,比如在一个对象中修改了引用的数据,会影响到另一个对象。上述代码中的第二个构造函数Vector(Vector& other, bool shallow)展示了如何实现浅克隆,但通常不会这样做,因为浅克隆容易引发问题,特别是在处理动态内存时。

 

标签:elements,capacity,Vector,int,模式,other,原型,size
From: https://www.cnblogs.com/pinganxile/p/18639507

相关文章

  • redis-2(集群模式)
    主从模式(master-slave)实战规划图实际配置1,克隆主机,以redis1为基础,克隆出redis2和32,配置IP和主机名称,重启,使用xshell链接vi/etc/sysconfig/network-scripts/ifcfg-ens33:1521->22vi/etc/hostname:1redis2reboot重启使用xshell或者finalShell链接......
  • 微服务架构设计模式PDF免费下载
    适读人群:本书的重点是架构和开发,适合负责开发和交付软件的任何人(例如开发人员、架构师、CTO等)阅读。示例代码使用Java语言和Spring框架世界十大软件架构师之一、微服务架构先驱者亲笔撰写,微服务实用落地指南。示例代码使用Java编程和Spring框架电子版仅供预览,下载后24小时内......
  • 设计模式-工厂和单例模式
    概念和作用分类7大原则工厂模式概念工厂模式是创建型模式,它是对象创建的最佳方案,特别是创建对象过程比较复杂。(如果理解new对象就可以完成功能,不需要用工厂模式)。好处实现对象的创建和使用的解耦。分类简单工厂模式简单工厂模式简介也叫静态工厂模式,可以根据不参数......
  • 从家谱的层级结构 - 组合模式(Composite Pattern)
    组合模式(CompositePattern)组合模式(CompositePattern)组合模式概述组合模式涉及的角色talkischeap,showyoumycode总结组合模式(CompositePattern)组合模式(CompositePattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组......
  • 中介者模式
    实验19:中介者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解中介者模式的动机,掌握该模式的结构;2、能够利用中介者模式解决实际问题。    [实验任务一]:虚拟聊天室在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,......
  • 备忘录模式
    实验 20:备忘录模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解备忘录模式的动机,掌握该模式的结构;2、能够利用备忘录模式解决实际问题。     [实验任务一]:多次撤销改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以......
  • 观察者模式
    实验21:观察者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解观察者模式的动机,掌握该模式的结构;2、能够利用观察者模式解决实际问题。    [实验任务一]:股票提醒当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的......
  • 状态模式
    实验 22:状态模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解状态模式的动机,掌握该模式的结构;2、能够利用状态模式解决实际问题。    [实验任务一]:银行账户用Java代码模拟实现课堂上的“银行账户”的实例,要求编写客户端测试代码模拟用......
  • 策略模式
    实验23:策略模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解策略模式的动机,掌握该模式的结构;2、能够利用策略模式解决实际问题。     [实验任务一]:旅行方式的选择旅游的出行方式有乘坐飞机旅行、乘火车旅行和自行车游,不同的旅游方式有......
  • 模板方法模式
    实验24:模板方法模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解模板方法模式的动机,掌握该模式的结构;2、能够利用模板方法模式解决实际问题。    [实验任务一]:数据库连接对数据库的操作一般包括连接、打开、使用、关闭等步骤,在数据库操......