Как работают свойства в объектно-ориентированном 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
3 ответа
Использование ванильного класса
При использовании класса vanilla вы должны указать 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
Как отмечает Кямран, для вышесказанного сработает определение Request
Метод в коде примера вопроса необходимо изменить, чтобы включить выходной аргумент типа testprop.
Спасибо, Камран.
Вы должны помнить, что синтаксически в Matlab вы, вероятно, ближе к C, чем к C++ или Java, по крайней мере, в отношении объектов. Итак, вы хотите изменить "содержимое" объекта значения (на самом деле просто специальный struct
), вам нужно вернуть объект из функции.
Azim был прав, когда указал, что если вы хотите поведение Singleton (которое, как вам кажется, из вашего кода), вам нужно использовать класс "handle". Экземпляры классов, производные от Handle, все указывают на один экземпляр и работают только с ним.
Вы можете прочитать больше о различиях между классами Value и Handle.
Я сделал класс testprop и попытался извинить код, предложенный Azim, но он не сработал. Когда я выполнил следующую команду:
a=a.Request(1)
Следующая ошибка была сгенерирована:
??? Ошибка при использовании ==> запроса. Слишком много выходных аргументов.
Я думаю, что проблема в том, что мы не определили какой-либо вывод при объявлении метода Request. Поэтому мы должны изменить это на:
function this = Request(this, val)
и сейчас:
>> a = testprop;
>> a = a.Request(1);
>> a.numRequests
ans = 1