我可以用MATLAB使用一个自定义复制方法创建数组时我类?
2视图(30天)
显示旧的评论
我有一个问题与一个类属性处理类。我创建了这个示例来演示这个问题:
classdefProblem_Class <处理
属性(SetObservable = true)
Prop1
结束
方法
函数s = Problem_Class
年代。Prop1 = Prop1_Class;
结束
结束
结束
classdefProp1_Class <处理
属性(SetObservable = true)
Prop2
结束
方法
函数s = Prop1_Class
年代。Prop2 = Prop2_Class;
结束
结束
结束
classdefProp2_Class <处理
属性(SetObservable = true)
的名字(:1)字符
结束
方法
函数s = Prop2_Class
年代。Name =”;
结束
结束
结束
如果我创建一个实例
Problem_Class
:
问题= Problem_Class
现在的问题如果我创建一个数组
Prop1
,例如:
problem.Prop1.Prop2。Name =“指数1”;
problem.Prop1 .Prop2 (8)。Name =“指数8”;
problem.Prop1 .Prop2 (7)。Name =“指数7”;
如果我们看一下
. name
属性为每个
problem.Prop1.Prop2
,我希望看到这个:
[problem.Prop1.Prop2];{ans.Name}’
{'指数1 '}
{1×0字符}
{1×0字符}
{1×0字符}
{1×0字符}
{1×0字符}
{'指数7 '}
{'指数8 '}
但我得到这个
{'指数1 '}
{'指数7 '}
{'指数7 '}
{'指数7 '}
{'指数7 '}
{'指数7 '}
{'指数7 '}
{'指数8 '}
这是发生的原因是在这里解释道:
//www.tianjin-qmedu.com/help/matlab/matlab_oop/initializing-arrays-of-handle-objects.html,
在陈述(最后)”结果在两个调用类的构造函数。第一个创建对象数组元素
(4、5)
。第二个创建一个默认的对象,MATLAB拷贝所有剩余的空数组元素。”
所以,当我电话
problem.Prop1 .Prop2 (8)。Name = '指数8 ';
MATLAB调用
Prop1_Class
构造函数一次,来填充
problem.Prop1 (8)
第二次,然后创建一个
Prop1_Class
对象,副本
problem.Prop1 (7)
。所以现在
problem.Prop1 (7)
都指向同一个对象在内存中。我不想要这个!我需要
problem.Prop1 (7)
是唯一的元素,我需要这个隐式地而不必pre-initialise发生
problem.Prop1 ()
数组中。
我以为我已经找到了解决方案:
//www.tianjin-qmedu.com/help/matlab/matlab_oop/custom-copy-behavior.html,
我创建了一个类的基础上
HandleCopy
在该页面示例,
Problem_Class
,
Prop1_Class
,
Prop2_Class
所有继承,所以他们应该自定义复制行为。我已经核实,如。
(b) =副本
,“
b
”的一个实例
Prop1_Class
,然后按预期的行为,创造一个独立的副本
b
在
一个
(这样
~ = b
,但他们的属性具有相同的值)。然而,MATLAB似乎并不时调用自定义复制方法创建一个数组!
回到前面的示例:当我打电话
problem.Prop1 .Prop2 (8)。Name = '指数8 ';
一旦MATLAB已经创建了
problem.Prop1 (8)
第二个元素,然后创建
Prop1_Class
对象和“副本”
problem.Prop1 (7)
,我怎样到MATLAB使用一个自定义的复制功能,所以我可以防止所有
problem.Prop1 (7)
指向同一个对象?
感谢阅读这篇文章,所有的帮助感激地接受!
接受的答案
埃米尔哈姆萨
2020年6月26日
似乎subsasgn ()
//www.tianjin-qmedu.com/help/matlab/ref/subsasgn.html
在这种情况下可能会有帮助。你可以控制任务的行为。下面的代码显示了一个非常粗糙的例子。你可以根据你的要求调整和改进
classdefProblem_Class <处理
属性(SetObservable = true)
Prop1
结束
方法
函数s = Problem_Class
年代。Prop1 = Prop1_Class;
结束
函数= subsasgn (S B)
n = S (2) .subs {:};
m =元素个数(A.Prop1);
num_new_elem = n - m;
如果num_new_elem > 1
为我= 1:num_new_elem-1
.Prop2 A.Prop1 (m + i)。Name =”;
结束
A.Prop1 .Prop2 (m + num_new_elem)。Name = B;
其他的
A.Prop1 .Prop2 (n)。Name = B;
结束
结束
结束
结束
例子
问题= Problem_Class;
problem.Prop1 (1) .Prop2。Name =“指数1”;%的当前定义subsasgn需要使用索引(1)第一个元素
problem.Prop1 .Prop2 (8)。Name =“指数8”;
problem.Prop1 .Prop2 (5)。Name =“指数7”;
x = [problem.Prop1.Prop2];
{x.Name}’
输出
ans =
8×1细胞数组
{“指数1”}
{1×0字符}
{1×0字符}
{1×0字符}
{“指数7”}
{1×0字符}
{1×0字符}
{“指数8”}