Конструктор копирования Matlab
-
05-07-2019 - |
Вопрос
Есть ли лучший способ реализовать copy constructor для matlab для класса, производного от handle, кроме добавления конструктора с одним входом и явного копирования его свойств?
obj.property1 = from.property1;
obj.property2 = from.property2;
и т.д.
Спасибо, Дэни
Решение
Если вам нужно быстрое и беспроблемное решение, предполагающее, что все свойства могут быть скопированы, взгляните на функцию PROPERTIES .Вот пример класса, который автоматически копирует все свойства:
classdef Foo < handle
properties
a = 1;
end
methods
function F=Foo(rhs)
if nargin==0
% default constructor
F.a = rand(1);
else
% copy constructor
fns = properties(rhs);
for i=1:length(fns)
F.(fns{i}) = rhs.(fns{i});
end
end
end
end
end
и немного тестового кода:
f = Foo(); [f.a Foo(f).a] % should print 2 floats with the same value.
Другие советы
Существует еще один простой способ создания копий объектов-дескрипторов с помощью matlab.mixin.Копируемый.Если вы наследуете от этого класса, вы получите метод copy, который скопирует все свойства для вас.
classdef YourClass < matlab.mixin.Copyable
...
a = YourClass;
b = copy(a); % b is a copy of a
Этот метод копирования создает копию без вызова конструкторов или функций набора свойств.Так что это должно быть быстрее.Вы также можете настроить поведение копирования, переопределив некоторые методы.
Вы даже можете использовать
try
F.(fns{i}) = rhs.(fns{i});
end
что делает метод более полезным