Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 使用超类时避免重复数据_Oop_Matlab_Pass By Reference - Fatal编程技术网

Oop 使用超类时避免重复数据

Oop 使用超类时避免重复数据,oop,matlab,pass-by-reference,Oop,Matlab,Pass By Reference,我第一次开发了一个MatlabOOP项目。我的父类将有一个非常大的矩阵,子类(许多)需要访问它。如何防止孩子们复制数据 在伪代码中,我要求 classdef parent properties largeMatrix; end end classdef child < parent methods function obj = child(parent) Data.parent of this child =

我第一次开发了一个MatlabOOP项目。我的父类将有一个非常大的矩阵,子类(许多)需要访问它。如何防止孩子们复制数据

在伪代码中,我要求

classdef parent
    properties
        largeMatrix;
    end
end
classdef child < parent
    methods
        function obj = child(parent)
             Data.parent of this child = Share from parent
        end
        ...
        something = largeMatrix(n,m);
    end
end
p = parent; p.largeMatrix = rand(100);
c1 = child(p);
c2 = child(p);
classdef父级
性质
大基质;
结束
结束
classdef子级<父级
方法
函数obj=子函数(父函数)
此子项的Data.parent=来自父项的共享
结束
...
某物=大矩阵(n,m);
结束
结束
p=父母;p、 大矩阵=兰特(100);
c1=儿童(p);
c2=儿童(p);
子项c1和c2都应该访问在原始
rand(100)
中创建的相同数据,但不应该复制
largeMatrix
,因为我需要很多子项,并且希望程序具有内存效率。将从文件中读取
largeMatrix


PS:这是我第一次在这个论坛上发帖,如果我发错了,请原谅。

类只是一种数据类型,它不包含任何数据。如果实例化
父类的对象
父类
,然后实例化
子类的对象
子类
,则默认情况下
子类
不会从
父类
继承任何数据。可以使用复制构造函数将数据从一个对象复制到另一个对象

child = parent;  % this copies the data in `parent` to `child`
但是,在这种情况下,Matlab会在
parent
中创建数据的副本

通过使用,可以避免复制数据。您可以将句柄对象指定给多个变量或将其传递给函数,而无需使MATLAB复制原始对象。比如说,

classdef A < handle
    properties
        largeMatrix;  % wrap your large data into a handle class
    end
end

classdef B
    properties
        data;
    end
    methods
        function obj = B(mydata)
            obj.data = mydata;
        end
    end
end

MATLAB在写入时复制数组

假设您的
父类是(无需将句柄子类化):

您的
孩子
班级是:

classdef child < parent
    methods
        function obj = child(parent)
            obj.largeMatrix = parent.largeMatrix;
        end
    end
end
查看内存中的跳转:

现在,让我们创建一个子项并检查数据是否被引用:

c = child(p);
size(c.largeMatrix)
如您所见,内存中没有跳转:

最后,让我们对孩子的数据做一个简单的更改:

c.largeMatrix(1) = 1;
如您所见,只有写入时才有效地复制数组


为了防止对
child.largeMatrix
进行写入,请使用属性
(Abstract=true)
在父类中定义属性,并在子类
(SetAccess=immutable)

中定义属性,即使父类不处理,也不能简单地创建子类,从而复制数据。只有在修改子对象中的数据时,才会进行复制。
p = parent;
p.largeMatrix = rand(1e4); % 750 MB circa
c = child(p);
size(c.largeMatrix)
c.largeMatrix(1) = 1;