xlabel name comando change achsenbeschriftung matlab oop properties matlab-class

name - ¿Cómo funcionan las propiedades en Object Oriented MATLAB?



matlab plot series name (3)

Usando una clase de vainilla

Al usar la clase estándar, debe decirle a Matlab que almacene una copia modificada del objeto para guardar los cambios en el valor de la propiedad. Asi que,

>> 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

Uso de la clase Handle

Si heredas de la clase de control, eso es

classdef testprop < handle

entonces puedes escribir,

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

Actualización: Uso de Vanilla Class

Como Kamran observa para que lo anterior funcione, la definición del método de Request en el código de ejemplo de la pregunta necesita ser cambiada para incluir un argumento de salida de tipo testprop .

Gracias Kamran.

Estoy intentando crear una clase MATLAB con una variable miembro que se está actualizando como resultado de una invocación a un método, pero cuando trato de cambiar la propiedad dentro de la clase (aparentemente, por lo que entendí de la gestión de memoria de MATLAB) crea una copia del objeto y luego lo modifica, dejando intacta la propiedad del objeto original.

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


Debes recordarlo sintácticamente en Matlab, probablemente estés más cerca de C, que C ++ o Java, al menos con respecto a los objetos. Por lo tanto, si desea cambiar los "contenidos" de un objeto de valor (realmente solo una struct especial), debe devolver el objeto de la función.

Azim estuvo en lo correcto al señalar que si desea el comportamiento de Singleton (que, según su código, parece), necesita usar una clase "manejar". Las instancias de clases que se derivan de Handle all apuntan a una sola instancia y operan solo sobre ella.

Puede leer más sobre las diferencias entre las clases Value y Handle.


Hice la clase testprop e intenté ejecutar el código sugerido por Azim, pero no funcionó. Cuando ejecuté el siguiente comando:

a=a.Request(1)

Se generó el siguiente error:

??? Error al usar ==> Solicitar demasiados argumentos de salida.

Creo que el problema es que no determinamos ningún resultado al declarar el método de Solicitud . Entonces deberíamos cambiarlo a:

function this = Request(this, val)

y ahora:

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