在matlab中模拟'this'指针
Posted
技术标签:
【中文标题】在matlab中模拟\'this\'指针【英文标题】:Simulate 'this' pointer in matlab在matlab中模拟'this'指针 【发布时间】: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://***.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 查看代码的编辑和新的最后一行
【参考方案1】:
目前,您的类是一个值类(MATLAB 的默认值)。如果您希望能够通过引用传递对象(更改将反映在原始对象中),您将通过子类化 handle
使其成为 handle class
classdef MyClass < handle
properties
arr
accessHandle
end
methods
function obj = MyClass(array, trans)
obj.arr = array;
obj.accessHandle = @(i) obj.arr(trans(i))
end
end
end
然后你就可以按照你期望的方式使用它了
m = MyClass([1 2 3], @(x)x);
m.accessHandle(2)
% 2
m.arr(2) = 5;
m.accessHandle(2)
% 5
更多关于这两个can be found here的区别的信息。
编辑
如果您需要MyClass
是一个值类,那么您可以将trans
值存储为一个属性,然后有一个普通的方法来访问该值
classdef MyClass
properties
arr
trans
end
methods
function obj = MyClass(array, trans)
obj.arr = array;
obj.trans = trans;
end
function res = access(obj, k)
res = obj.arr(obj.trans(k));
end
end
end
或者,如果您愿意,您可以将 accessHandle
设为返回函数句柄的依赖属性。
classdef MyClass
properties
arr
trans
end
properties (Dependent)
accessHandle
end
methods
function obj = MyClass(array, trans)
obj.arr = array;
obj.trans = trans;
end
function res = get.accessHandle(obj)
res = @(i)obj.arr(obj.trans(i));
end
end
end
【讨论】:
看编辑,类应该是值类,改动只针对accessHandle
的定义
@OmerRosler 为什么它需要是一个值类?如果没有句柄类,您将无法做到这一点。
@OmerRosler 另外,为什么不能将对象传递给accessHandle
匿名函数?
@OmerRosler 或者把accessHandle
变成一个真正的方法
嗯,类是一个数组,访问数据的方式很奇怪,它具有值类的语义;访问函数需要类的句柄,而不是类本身以上是关于在matlab中模拟'this'指针的主要内容,如果未能解决你的问题,请参考以下文章
android studio2.3.3 模拟器 Jni函数调用C++对象,lldb调试this指针和相关变量显示无效的原因
如何传递 matlab::data::TypedArray<double> 作为指针在 MATLAB mex 文件中构造犰狳矩阵?