Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop MATLAB:将一个类从空实例实例化为';空白';实例_Oop_Class_Matlab - Fatal编程技术网

Oop MATLAB:将一个类从空实例实例化为';空白';实例

Oop MATLAB:将一个类从空实例实例化为';空白';实例,oop,class,matlab,Oop,Class,Matlab,为什么我的实例化函数不创建该函数的“空白”实例 我有以下最低等级: 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(S

为什么我的实例化函数不创建该函数的“空白”实例

我有以下最低等级:

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
正如您所看到的,运行我的实例化不起作用,我也不明白为什么?当然,它应该用一个非空但为空的实例替换空实例吗

更新:

SCFrench的链接在标题“创建空数组”下指向此链接,但这也不起作用:

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

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

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


MATLAB按值传递句柄对象数组(包括1×1“标量”数组)。句柄值是对对象的引用,可用于更改对象的状态(即其属性),但重要的是,它不是对象本身。如果将句柄值数组传递给函数或方法,则数组的副本实际上会传递给函数,修改副本的维度对原始数组没有影响。事实上,当你打电话的时候

TheOther.Instantiate;  
分配给
Self(1,1)
实例作为
Instantiate
的输出返回,并分配给
ans


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

您对变量名称的选择真的很重要:)这是一场关于这个、那个和另一个的游戏,厌倦了到处看到foobar:DIMO具体示例总是更好;类似于一个
学生
类,有
名称
属性。我已经在实际代码上这样做了,下次在这里也会这样做:如果我必须这样做,那么做另一个就更简单了。我真的在处理一棵对象树,所以我真的在分配这个。那个。那个。那个。另一个。或者可能是什么东西,我真的很想实例化,因为我发现了空括号。我不确定这是否有帮助,但是这个关于用handle类实例创建节点链表的演示可能会给你一些想法:最后我选择了
Parent.Sub=Sub
。感谢您的帮助,那么我如何让ans分配回另一个实例呢?我的理解是,进入实例化的参数Self应该是对另一个实例的引用,然后我肯定能够填充原始实例?然后我可以使实例非空。重复使用道具不起作用(张贴在上面)@Carel:你真的应该重新考虑你的类设计,
Instantiate
不应该是成员函数;可能是一个助手函数,或者像我建议的那样是一个静态函数。我可以问一下你的建议吗?目前,我正在考虑重写empty来创建一组空的项,然后重写isempty来声明它们是空的,如果它们的值是默认值。
TheOther.Instantiate;