2008-10-29 8 views
5

Есть ли лучший способ реализации copy construcor для matlab для производного класса handle, кроме добавления конструктора с одним входом и явно копирования его свойств?Конструктор копий Matlab

obj.property1 = from.property1; 
obj.property2 = from.property2; 

т.д.

Спасибо, Дани

+0

Вы можете разработать? Какую версию Matlab вы используете? – Azim 2008-10-29 16:24:45

+0

Я использую Matlab 2008a, и я использую классы в основном по ссылке (таким образом, исходя из дескриптора), но иногда мне нужно передавать их по значению, например. classdef Запроса <обрабатывать свойства цена количественных концом конца – Dani 2008-10-29 16:43:06

+0

classdef RequestManager <обрабатывать свойства requestsHistory конца методы функции HandleRequest (это, запрос) this.requestsHistory = [this.requestsHistory Запроса]; конец конец конец – Dani 2008-10-29 16:46:40

ответ

8

Если вы хотите быстро и грязный решение, которое принимает на себя все свойства могут быть скопированы, посмотрите на свойства функции. Вот пример класса, который автоматически копирует все свойства:

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. 
2

Вы можете даже использовать

try 
F.(fns{i}) = rhs.(fns{i}); 
end 

, что делает метод более полезным

8

Существует еще один простой способ создания копий объектов handle с помощью matlab.mixin.Copyable. Если вы наследуете этот класс, вы получите метод копирования, который скопирует все ваши свойства.

classdef YourClass < matlab.mixin.Copyable 
... 

a = YourClass; 
b = copy(a); % b is a copy of a 

Этот метод копирования создает копию без вызова конструкторов или задает функции свойств. Так что это должно быть быстрее. Вы также можете настроить поведение копии, переопределив некоторые методы.