【问题标题】:Matlab copy constructorMatlab复制构造函数
【发布时间】:2008-10-29 16:14:29
【问题描述】:

除了添加具有一个输入的构造函数并显式复制其属性之外,是否有更好的方法来为句柄派生类实现 matlab 的复制构造函数?

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

等等

谢谢, 丹妮

【问题讨论】:

  • 你能详细说明一下吗?你用的是什么版本的 Matlab?
  • 我使用的是 Matlab 2008a,我主要通过引用使用类(因此从句柄派生)但有时我需要按值传递它们,例如classdef 请求
  • classdef RequestManager
  • 好的。我还没有答案,但如果我想到什么,我会发布一个。

标签: matlab oop copy-constructor


【解决方案1】:

还有另一种简单的方法可以使用 matlab.mixin.Copyable 创建句柄对象的副本。如果您从此类继承,您将获得一个复制方法,该方法将为您复制所有属性。

classdef YourClass < matlab.mixin.Copyable
...

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

此复制方法无需调用构造函数或设置属性函数即可创建副本。所以这应该更快。您还可以通过重写某些方法来自定义复制行为。

【讨论】:

  • 如果你想复制一个子类怎么办,即如果 a 是 YourClass 的某个子类的实例,但你不希望 b 成为子类(即你想要超类 (YourClass)功能)?
  • 您需要编写方法来执行此操作。
【解决方案2】:

如果您想要一个假定所有属性都可以复制的快速而简单的解决方案,请查看 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.

【讨论】:

  • 在构造函数中,您可能应该在开始复制属性之前测试“rhs”是否属于 Foo (isa(rhs, 'Foo')) 类型。
【解决方案3】:

你甚至可以使用

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

这使得方法更有用

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2020-05-14
    • 2016-09-12
    相关资源
    最近更新 更多