在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'指针的主要内容,如果未能解决你的问题,请参考以下文章

C语言模拟C++的this对象思想

android studio2.3.3 模拟器 Jni函数调用C++对象,lldb调试this指针和相关变量显示无效的原因

如何传递 matlab::data::TypedArray<double> 作为指针在 MATLAB mex 文件中构造犰狳矩阵?

Matlab指针

this指针

this指针是指向虚函数表的指针