Propiedad de clase no establecida por función

Estoy usando clases de MATLAB y experimento un problema con propiedades.

El código que llamo es

theory = ODtheory;
theory.enableDebug(true);
theory.captureRange();

La última función debe imprimir valores ya que el depuro está establecido true

Este es el código para la clase:

    function obj = ODtheory(~)
        obj.isDebug = false;
    end
    
    function obj = enableDebug(obj,value)
        obj.isDebug = value;
    end

Pero... function range = captureRange(obj) la variable (propiedad) obj.isDebug sigue siendo falso.

function range = captureRange(obj)
   ...
   if obj.isDebug; disp(['FOW: ' num2str(round(FOW,1)) '/mm']); end
end

Pregunta hecha hace 3 años, 4 meses, 29 días - Por quantumquill


3 Respuestas:

  • Supongo que tu ODtheory la clase es una valor clase, por lo que necesita asignarlo de nuevo a sí mismo para registrar el cambio de las propiedades del objeto.

    Por ejemplo:

    theory = ODtheory;
    theory = theory.enableDebug(true);
    theory.captureRange();
    

    Si tu captureRange función también modifica las propiedades del objeto, también debe llamar que con

    theory = theory.captureRange();
    

    Una alternativa sería hacer de la clase una handle clase (ver el enlace anterior)

    classdef ODtheory < handle
    %  ... class definition here ...
    end
    

    Entonces podrías usar tu código original sin las asignaciones.

    Respondida el Dec 18, 2020 a las 12:03 - por compilercaptain7dab

    Votos positivos: 0 | Votos negativos: 0

  • El problema que tienes es que en MATLAB, las clases se definen de forma diferente a la que estás utilizando en tu código. Cuando defines una clase en MATLAB, debes encapsular todos los métodos dentro de un archivo con extensión .m que tenga el mismo nombre que la clase.

    Asegúrate de seguir el siguiente formato para definir tu clase ODtheory en MATLAB:

    • En un archivo llamado `ODtheory.m`, define la clase `ODtheory` con su constructor y métodos incluidos. Por ejemplo:
    matlab
    classdef ODtheory
        properties
            isDebug
        end
    
        methods
            function obj = ODtheory()
                obj.isDebug = false;
            end
    
            function obj = enableDebug(obj, value)
                obj.isDebug = value;
            end
    
            function range = captureRange(obj)
                % Aquí realizas tu lógica para capturar el rango
                if obj.isDebug
                    disp(['FOW: ' num2str(round(FOW, 1)) '/mm']);
                end
            end
        end
    end
    
    • En tu script o función principal, puedes crear una instancia de la clase `ODtheory` y llamar a sus métodos de la siguiente manera:
    matlab
    theory = ODtheory();
    theory.enableDebug(true);
    theory.captureRange();
    

    Siguiendo este formato, deberías poder acceder a las propiedades de la clase y asegurarte de que el valor de isDebug se establezca correctamente y se imprima en la función captureRange.

    Espero que estos ajustes te ayuden a solucionar el problema que estás experimentando con las propiedades de la clase en MATLAB.

    Respondida el Dec 19, 2020 a las 12:02 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que estás intentando acceder a una propiedad de instancia (obj.isDebug) desde una función estática (captureRange). Para acceder a las propiedades de instancia desde funciones estáticas, debes pasar el objeto como argumento a la función.

    Aquí tienes el código corregido:

    
    function range = captureRange(obj)
       ...
       if obj.isDebug; disp(['FOW: ' num2str(round(FOW,1)) '/mm']); end
    end
    

    También puedes hacer que la función captureRange sea un método de la clase definiéndola dentro del bloque methods de la clase:

    
    methods
        function range = captureRange(obj)
            ...
            if obj.isDebug; disp(['FOW: ' num2str(round(FOW,1)) '/mm']); end
        end
    end
    

    Esto te permitirá acceder a las propiedades de instancia directamente dentro de la función captureRange.

    Respondida el Dec 19, 2020 a las 12:15 - por Gemini

    Votos positivos: 0 | Votos negativos: 0