重载的subsref部分失败

5视图(30天)
斯文
斯文 2016年10月27日
评论道: 斯文2016年10月28日
你好,
我想创建一个数组类通用的维度。所以我想过载subsref索引。工作主要是一见钟情,现在遇到奇怪的行为,这个最小的例子所示:
Main.m:
ThisArray = MyArray;
ThisArray (:)% < - - - - -这是很好
ThisArray.ChangeArray;
ThisArray (:)% < - - - - -这是很好
MyArray.m:
classdefMyArray <处理
属性
MainArray
结束
方法
函数obj = MyArray
obj。MainArray = [1 2;3 4];
结束%函数MyArray
函数sref = subsref (obj,年代)
开关(1).type
情况下“()”
sref = obj.MainArray (s (1) .subs {:});
否则
sref =内装式(“subsref”obj,年代);
结束%开关
结束%函数subsref
函数obj = ChangeArray (obj)
obj.MainArray (1) = obj.MainArray (1) + 1;
obj (:)% < - - - - - -这一次只显示对象
NewArray = MyArray;
NewArray (:)% < - - - - - -这一次只显示对象
结束%函数ChangeArray
结束
结束
从主要工作正常运行这个主要都标志着MainArray出现输出想要的。但是当我叫ChangeArray subsref过载不工作了。都试图使用重载索引输出对象,表明我的重载subsref不是反应,(:)只是忽略。断点在subsref开关没有这个函数的输入有问题的场合。
为什么我不能在这个对象中使用这些指数的方法。
注::我喜欢的句柄继承类,但是删除它似乎没有发挥作用。
感谢任何帮助。

接受的答案

马特·J
马特·J 2016年10月27日
编辑:马特·J 2016年10月27日
SUBSREF不是由索引表达式classdef内部文件。在classdef,您必须显式地调用subsref如果您想要执行:
函数obj = ChangeArray (obj)
obj.MainArray (1) = obj.MainArray (1) + 1;
S =结构(“类型”,“()”,“潜艇”,{“:”});
subsref (obj, S)
NewArray = MyArray;
subsref (NewArray S)
结束%函数ChangeArray
这是为了让你使用索引表达式内subsref方法没有它们引发无限递归调用链subsref方法本身。
1评论
斯文
斯文 2016年10月28日
谢谢你的回答。可以避免可能的递归。你说之后似乎是显而易见的。

登录置评。

答案(1)

史蒂文的主
史蒂文的主 2016年10月27日
看到“内置subsref subsasgn召集方法”部分 这个文档页面
如果你想调用重载 subsref subsasgn 方法 在一个方法 您必须显式地调用 subsref (…) subsasgn (…)
你不能调用重载的索引方法隐式的索引的对象使用括号 obj (1) 花括号像 obj {2} ,或者点引用 obj.prop1

类别

找到更多的在定制对象索引帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!