我有一个封装以奇怪方式访问数组的类; 类构造函数需要一个功能手柄,该手柄是某种指标的改造将它们传递给数组在matlab中模拟'this'指针
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++ /等
的简单的解决方案是创建一个手柄到阵列并将其传递给该函数:
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
@TroyHaskin @Suever我不能像我在最后一次交待中解释的那样使它变成句柄; 'foo'不改变输入,只是它的副本 –
'accessHandle'的等效C++定义是'[this](int x){return this-> arr(trans(x));}'如果这有帮助 –