其他分享
首页 > 其他分享> > Systemverilog-- OOP--对象的拷贝

Systemverilog-- OOP--对象的拷贝

作者:互联网

目录

 

浅拷贝:

定义拷贝函数:

拷贝函数总结:


 

浅拷贝:

Packet p1;
Packet p2;
p1 = new;
p2 = new p1;

在创建p2对象时,将从p1拷贝其成员变量例如 interger,string和句柄等,这种拷贝方式称为浅拷贝(shallow copy)。

定义拷贝函数:

如果要拷贝对象,指的是首先创建一个新的对象(开辟新的空间),再将目标对象的成员变量拷贝给新对象的成员,使新对象与目标对象的成员变量数值保持一致,即完成了对象的拷贝(成员变量的拷贝)

例如如下的代码:

class basic_test;    //父类
    ...
    virtual function void copy_data(basic_test t);
        t.def = def;
        t.fin = fin;
    endfunction
    virtual function basic_test copy();
        basic_test t = new(0);
        copy_data(t);
        return t;
    endfunction
endclass


class test_wr extends basic_test; //子类
    ...
    function void copy_data(basic_test t); //子类与父类的形参要相同,故 t 是父类句柄
        test_wr h;  // h 是子类句柄
        super.copy_data(t); // 调用父类的copy_data()函数
        $cast(h,t);  //这把父类句柄转化为子类句柄,指向子类对象
        h.def = def;
    endfunction
    function basic_test copy();
        test_wr t = new();  // t是子类句柄,指向子类对象
        copy_data(t);  // copy_data里面的参数是父类句柄,这里有一个隐式转换,子类句柄转换为父类句柄,故 t 是父类句柄,指向子类对象
        return t;  // 这返回的还是父类句柄
    endfunction
endclass

copy_data函数: 只拷贝变量,把当前的变量def/fin, 传递给t所指的新对象的成员变量,

copy函数:创建一个对象,然后调用copy_data()对里面的成员变量做赋值,最后返回该对象的句柄 

拷贝函数总结:

1)将成员拷贝函数copy_data() 和新对象生成函数copy() 分为两个方法,这样使得子类继承和方法复用较为容易。

2)为了保证父类和子类的成员均可以完成拷贝,将拷贝方法声明为虚方法,且遵循只拷贝该类的域成员的原则,父类的成员拷贝应由父类的拷贝方法完成。

3)在实现copy_data() 过程中,应该注意句柄的类型转换,保证转换后的句柄可以访问类成员变量

标签:父类,--,句柄,OOP,子类,拷贝,copy,data,Systemverilog
来源: https://www.cnblogs.com/tianranjushi/p/16439272.html