Как работают свойства в объектно-ориентированном 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
Другие вопросы по тегам