为什么我的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
答案 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