【发布时间】:2016-12-03 15:16:27
【问题描述】:
我有一个类,它以一种奇怪的方式封装了对数组的访问; 类构造函数接受一个函数句柄,它是在将索引传递给数组之前对索引进行某种转换
classdef MyClass
properties
arr
accessHandle
end
methods
function obj = MyClass(array, trans)
obj.arr = array;
obj.accessHandle = @(i) obj.arr(trans(i))
end
end
问题是匿名函数将数组复制到它自己的工作区中,如果我们更改数组,它不会在函数中更改。 本质上,需要将“this”指针/引用传递给匿名函数,就像在 Java/C++/etc 中一样
简单的解决方案是创建一个数组句柄并将其传递给函数:
classdef MyClass
properties
arr
accessHandle
end
methods
function obj = MyClass(array, trans)
obj.arr = array;
tmp = PropertyReference(obj, 'arr'); %See http://stackoverflow.com/questions/7085588/matlab-create-reference-handle-to-variable
%for the definition
obj.accessHandle = @(i) tmp(trans(i));
end
end
end
现在的问题是,当我将类的实例传递给函数时,传递的引用仍然指向函数外的对象:
function foo(ins)
ins.arr = [1 2];
disp(ins.accessHandle(1));
end
cl = MyClass([0 3], @(x) x);
foo(cl) //output 0 instead of 1
disp(ins.accessHandle(1)) //output 0
编辑:该类应该是一个值类,其语义是当复制该类时,accessHandle 字段会更改它使用的数组句柄。
如何实现正确的语义?
【问题讨论】:
-
子类化
handle会解决这个问题吗? -
@TroyHaskin @Suever 我不能像我在上一句中解释的那样让它成为一个句柄;
foo不改变输入,只是复制 -
如果有帮助,
accessHandle的等效 C++ 定义将是[this](int x){return this->arr(trans(x));} -
你没有让
arr成为一个句柄;您正在制作MyClass一个具有指针语义的handle类对象。 @Suever 的回答似乎有你想要的行为。如果缺少,请用更具说明性的示例进行说明。 -
@TroyHaskin 查看代码的编辑和新的最后一行
标签: matlab this function-handle