c++ 代理类 copy clone

本文探讨了在容器中使用基类指针管理派生类对象的问题,并提出了通过引入复制代理来解决这一问题的方法。文中详细介绍了复制代理的概念、实现方式及其如何辅助内存管理和元素操作。

在容器中同时存放基类和代理类会存在问题  会缺失数据

容器中存放基类的指针 1、内存管理的负担  2、 要操作元素,必须知道对象的静态类型


copy clone诞生

基类中诞生一个纯虚函数和虚析构函数


定义一个行为与父类对象相似,而又潜在的表示所有继承自父类对象的类,该类的对象就是代理。

复制代理就会复制相应的对象,给代理赋新值也会删除旧对象,再复制新对象。

代理类中有一个私有的父类型的指针;代理不会继承,是一个第三者。

考虑到父类含有纯虚函数,引入空代理的概念。


虚拟调用

非0检测

赋值操作符的检查


class Vehicle

{

public:

virtual double weight() const = 0;

virtual void start() = 0;

virtual Vehicle* copy() const = 0;

virtual ~Vehicle() {}

};


Vehicle* Truck::copy() const

{

return new Truck(*this);

}


class VehicleSurrogate

{

public:

VehicleSurrogate();

VehicleSurrogate(const Vehicle&);

VehicleSurrogate ();

VehicleSurrogate(const VehicleSurrogate &);     vp(入参.vp ? 入参->copy:0)

VehicleSurrogate& operator=(const VehicleSurrogate&);    if(this != 入参)

private:

Vehicle *vp;

}









### UVM中copyclone方法的区别及使用场景 在UVM(Universal Verification Methodology)中,`copy``clone`是两个用于对象复制的重要方法,但它们的行为使用场景有所不同,尤其是在`uvm_object``uvm_component`这两个基中。 #### `copy()` 方法 `copy()`方法主要用于将一个对象的内容复制到另一个已经存在的对象中。这意味着在调用`copy()`之前,目标对象必须已经被创建。`copy()`方法通常用于浅拷贝,即只复制对象的引用,而不是对象本身的内容。因此,原始对象副本可能会共享相同的内部数据结构[^3]。 在UVM中,`copy()`方法的实现通常依赖于`do_copy()`钩子函数。如果用户没有重写`do_copy()`函数,则会使用UVM提供的默认实现。这种默认实现可能无法满足某些特定的需求,因此用户可以根据自己的需求重写`do_copy()`函数以实现更精确的复制逻辑[^2]。 #### `clone()` 方法 `clone()`方法则是在`copy()`的基础上进一步封装,它不仅复制对象的内容,还会创建一个新的对象实例。具体来说,`clone()`方法首先会调用`new()`来创建一个新的对象,然后调用`copy()`方法将源对象的内容复制到新创建的对象中。这种方式确保了新对象与原对象完全独立,修改一个不会影响另一个,因此更适合需要独立副本的场景。 由于`clone()`方法涉及到了对象的创建复制,因此它通常用于深拷贝,即不仅复制对象本身,还会递归地复制其包含的所有嵌套对象。这种方式虽然提供了更高的独立性,但也可能导致更高的内存消耗性能开销[^3]。 #### 使用场景 - **`copy()`**:适用于只需要复制对象内容而不需创建新对象的情况。例如,在测试平台中,当需要将一个已有的事务对象的内容复制到另一个事务对象中时,可以使用`copy()`方法。 - **`clone()`**:适用于需要创建一个完全独立副本的情况。例如,在生成多个独立的测试序列时,可以使用`clone()`方法来确保每个序列都是独立的,不会相互干扰。 ### 示例代码 以下是一个简单的示例,展示了如何在UVM中使用`copy()``clone()`方法: ```systemverilog class my_transaction extends uvm_object; // 定义事务的属性 int data; // 构造函数 function new(string name = "my_transaction"); super.new(name); endfunction // 重写do_copy方法 virtual function void do_copy(uvm_object rhs); my_transaction rhs_; if (!$cast(rhs_, rhs)) begin `uvm_error("MY_TRANSACTION", "Cast failed") end data = rhs_.data; endfunction endclass module test; initial begin my_transaction t1 = new("t1"); my_transaction t2 = new("t2"); // 使用copy方法 t1.data = 10; t2.copy(t1); $display("t2.data after copy: %0d", t2.data); // 输出10 // 使用clone方法 my_transaction t3 = t1.clone(); $display("t3.data after clone: %0d", t3.data); // 输出10 end endmodule ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值