MATLAB:将一个类从空实例实例化为“空白”实例

时间:2012-06-19 14:24:55

标签: oop class matlab

为什么我的Instantiate函数没有创建那个?'/ / p>的'Blank'实例

我有以下小班:

classdef That < handle
 properties
  This = ''
 end
 methods
  function Self = That(String)
   if exist('String','var') == 1
    Self.This = String;
   end
  end
  function Self = Instantiate(Self)
   if isempty(Self)
    Self(1,1) = That;
   end
  end
 end
end

如果我跑

This = That;
disp(size(This))     % 1x1
disp(isempty(This))  % False

这一切都很好,我有一个“空白”类的实例

如果我跑

TheOther = That.empty;
disp(size(TheOther))     % 0x0
disp(isempty(TheOther))  % True
TheOther.Instantiate;  
disp(size(TheOther))     % 0x0   - Expecting 1x1
disp(isempty(TheOther))  % True  - Expecting False

正如您所看到的,运行我的Instantiate不起作用,我看不出原因?当然它应该用非空的空白实例替换空实例吗?

更新:

来自SCFrench的链接指向创建空数组标题下的http://www.mathworks.com/help/techdoc/matlab_oop/brd4btr.html,但这也不起作用:

function Self = Instantiate(Self)
 if isempty(Self)
  Blank = That;
  Props = properties(Blank)
  for idp = 1:length(Props)
   Self(1,1).(Props{idp}) = Blank.(Props{idp});
  end
 end
end

2 个答案:

答案 0 :(得分:2)

MATLAB按值传递句柄对象的数组(包括1-by-1&#34;标量&#34;数组)。句柄值是对象的引用,可用于更改对象的状态(即其属性),但重要的是,它不是对象本身。如果将句柄值数组传递给函数或方法,则实际将数组的副本传递给函数,并且修改副本的尺寸对原始文件没有影响。事实上,当你打电话

TheOther.Instantiate;  

您分配给That的{​​{1}}实例将作为Self(1,1)的输出返回并分配给Instantiate

This link对MATLAB面向对象设计文档的一部分也可能有帮助。

答案 1 :(得分:0)

也许你应该把它变成静态函数:

methods (Static)
    function Self = Instantiate(Self)
        if isempty(Self)
            Self(1,1) = That;
        end
    end
end

然后:

>> TheOther = That.empty;
>> size(TheOther)
ans =
     0     0
>> isempty(TheOther)
ans =
     1
>> TheOther = That.Instantiate(TheOther);
>> size(TheOther)
ans =
     1     1
>> isempty(TheOther)
ans =
     0