Matlab:静态类成员

时间:2016-08-26 17:17:09

标签: matlab list class static

我正在尝试实现一个列表,该列表可以在Matlab中用作实例计数器。我希望这个清单是静态的。

到目前为止,matlab中没有静态关键字,但它们提供的模式几乎可以完成这项工作:

声明一个继承句柄的类List:

classdef List < handle

   properties (Access = private)
      cellRepresentingAList = {};
   end

   ..... %Implement any functions

end

然后您可以通过以下方式使用它:

classdef MyClassUsingAList < handle

    properties (Constant, Access = private)
       myListOfStuff = List();
    end

    .....

 end

我们使用句柄对象作为常量这一事实导致MyClassUsingAList的每个实例都将使用相同的对象句柄,即我有一个静态列表。

在遇到异常之前,一切都运行良好。或者我使用“停止调试”按钮进行调试并停止调试,或者保存。此时,列表已清除。空。

这不是我可以投入生产的东西。

Matlab提供了持久变量,它在函数中扮演静态变量的角色,但是不可能在类中使用它们(除非你在使用列表的每个方法中使用关键字'persistent')。

有没有可靠的方法来实现这一目标?

由于

1 个答案:

答案 0 :(得分:1)

使用persistent关键字,如here所述。 (你选择了第二种方法,我认为你需要的是这个方法)。如果使用mlock命令描述的内容,您可以锁定意外清除的功能。

请注意,如你所说,必须在每个方法中定义一个持久变量! (事实上​​,这可能会产生与你想要的相反的效果,因为持久变量对于每个函数是唯一的,而不是作为整体的类)。只需使用静态访问创建一个方法,其唯一的目的是保留该持久变量的副本,并在需要获取或设置它的任何其他非静态方法中引用该方法。

E.g。

classdef myclass

  properties
    Prop1;
    Prop2;
  end

  methods(Static, Access='public')
    function Out = StaticVar1(In)   % first static "variable"
      mlock
      persistent var;
      if isempty(var); var = 0; end          % initial value
      if nargin < 1; Out = var; return; end  % get value
      var = In;                              % set value
    end
    function Out = StaticVar2(In)   % second static "variable"
      mlock
      persistent var;
      if isempty(var); var = 0; end          % initial value
      if nargin < 1; Out = var; return; end  % get value
      var = In;                              % set value
    end
  end

  methods
    function Out = addStaticVars(o)
      Out = o.StaticVar1 + o.StaticVar2;
    end
  end
end

使用示例:

>> a = myclass();
>> myclass.StaticVar1       % access the first static "variable"
ans =
     0
>> myclass.StaticVar2       % access the second static "variable"
ans =
     0
>> myclass.StaticVar1(10)   % set static "variable" to 10
>> myclass.StaticVar2(20)   % set static "variable" to 20
>> a.addStaticVars()        
ans =
    30
>> b = myclass();
>> b.addStaticVars()
ans =
    30

>> clear all;               % inneffective as functions are "locked"
>> myclass.StaticVar1
ans =
    10

>> munlock myclass.StaticVar1
>> clear all;        % this will now succeed in clearing the static "variable"
>> myclass.StaticVar1
ans =
     0