继承matlab.mixin.Copyable的对象复制后原对象改变,求助排查
解决MATLAB中
matlab.mixin.Copyable复制后原对象被修改的问题 你遇到的问题不是操作错误,而是因为matlab.mixin.Copyable默认实现的是浅拷贝:如果你的类包含引用类型的属性(比如句柄对象、系统对象、带有句柄的结构体等),修改副本的这类属性会直接影响原对象,因为二者共享同一个引用。
解决方案:重写copyElement方法实现深拷贝
matlab.mixin.Copyable的copy方法会调用copyElement来完成对象复制,默认的copyElement只做浅拷贝。你需要在子类中重写这个方法,对所有引用类型的属性手动执行深拷贝。
举个适配你类的示例:
classdef ImageReaderAny < ImageReaderBase & matlab.mixin.Copyable properties % 假设你的类包含以下属性(根据实际情况调整) ProcessFolder FileHandler % 示例:句柄类型属性 Metadata % 示例:包含句柄的结构体数组 end methods function obj = ImageReaderAny(processFolder) obj.ProcessFolder = processFolder; % 初始化其他属性的逻辑... end function copiedObj = copyElement(obj) % 先调用父类方法获取基础浅拷贝对象 copiedObj = copyElement@matlab.mixin.Copyable(obj); % 对引用类型属性执行深拷贝 % 1. 处理单个句柄对象 if isprop(obj, 'FileHandler') && ~isempty(obj.FileHandler) copiedObj.FileHandler = copy(obj.FileHandler); end % 2. 处理包含句柄的结构体数组/元胞数组 if isprop(obj, 'Metadata') && ~isempty(obj.Metadata) copiedObj.Metadata = cellfun(@copy, obj.Metadata, 'UniformOutput', false); end % 其他引用类型属性同理添加处理逻辑 end end end
关键检查点
- 排查
ImageReaderAny和父类ImageReaderBase中所有属性的类型:值类型(如数值、字符串、普通结构体)无需额外处理,引用类型必须单独深拷贝。 - 复制完成后验证:修改副本的属性,检查原对象对应属性是否保持独立,确认深拷贝生效。
内容的提问来源于stack exchange,提问作者Matthias Pospiech
相关产品推荐
相关产品推荐

