Подтвердить что ты не робот

Как работают свойства в объектно-ориентированном MATLAB?

Я пытаюсь создать класс MATLAB с переменной-членом, которая обновляется в результате вызова метода, но когда я пытаюсь изменить свойство внутри класса, это (по-видимому, из того, что я понял из управления памятью MATLAB) создает копию объекта, а затем изменяет его, оставляя исходное свойство объекта нетронутым.

classdef testprop  
    properties  
        numRequests=0;  
    end  
    methods  
        function Request(this, val)  
            disp(val);  
            this.numRequests=this.numRequests+1;  
        end  
    end  
end  

.

>> a=testprop;
>> a.Request(9);
>> a.Request(5);  
>> a.numRequests  

ans = 0  
4b9b3361

Ответ 1

Использование ванильного класса

При использовании ванильного класса вам необходимо сообщить Matlab, чтобы сохранить измененную копию объекта, чтобы сохранить изменения в значении свойства. Таким образом,

>> a=testprop
>> a.Request(5); % will NOT change the value of a.numRequests.
5

>> a.Request(5) 
5

>> a.numRequests
ans = 
       0

>> a=a.Request; % However, this will work but as you it makes a copy of variable, a.
5

>> a=a.Request; 
5

>> a.numRequests
ans =
       2

Использование класса Handle

Если вы наследуете класс дескриптора, то есть

classdef testprop < handle

тогда вы можете написать

>> a.Request(5);
>> a.Request(5);
>> a.numRequests
ans = 
       2

Обновление: использование класса Vanilla

Как Заметки Kamran для вышеописанного для работы определение метода Request в примере кода вопроса необходимо изменить, чтобы включить выходной аргумент типа testprop,

Спасибо Kamran.

Ответ 2

Вы должны помнить, что синтаксически в Matlab, вы, вероятно, ближе к C, чем С++ или Java, по крайней мере, относительно объектов. Итак, вы хотите изменить "содержимое" объекта значения (на самом деле это просто специальный struct), вам нужно вернуть объект из функции.

Азим был прав, указав, что если вы хотите Singleton поведение (которое, по вашему мнению, вам кажется), вам нужно для использования класса "handle". Экземпляры классов, которые выводятся из Handle, указывают на один экземпляр и работают только на нем.

Вы можете узнать больше о различиях классов Value и Handle.

Ответ 3

Я сделал класс testprop и попытался исправить код, предложенный Азимом, но он не работал. Когда я выполнил следующую команду:

a=a.Request(1)

Произошла следующая ошибка:

??? Ошибка при использовании == > Request Слишком много выходных аргументов.

Я думаю, проблема в том, что мы не определяли какой-либо вывод при объявлении метода Запрос. Поэтому мы должны изменить его на:

function this = Request(this, val)

и теперь:

>> a = testprop;
>> a = a.Request(1);        
>> a.numRequests

ans = 1