【问题标题】:Matlab - Combining enumeration classes with non-static methodsMatlab - 将枚举类与非静态方法相结合
【发布时间】:2014-01-04 17:12:34
【问题描述】:

我正在尝试将枚举类与 Matlab 中的非静态方法结合起来。我希望创建一个“LogEvent”类,它具有函数“log”,该函数将枚举成员(例如 LogEvent.INFO、LogEvent.ERROR 或 LogEvent.WARNING)和一个字符串作为输入参数,用于将此消息附加到文件中。我希望对不同的程序重复使用这个 LogEvent 类,因此该类具有在构造过程中指定的属性“fileName”并引用输出文件。下面是形成我的 classdef 文件的代码:

classdef LogEvent
%Class definition for logging events.

properties
    fileName;
end

methods
    function obj = LogEvent(outFile)
        obj.fileName = outFile;
    end

    function log(obj,type,logStr)

        switch (type)
            case LogEvent.INFO
                typeStr = 'INFO';
            case LogEvent.WARNING
                typeStr = 'WARNING';
            case LogEvent.ERROR
                typeStr = 'ERROR';
        end

        FID = fopen(obj.fileName,'a');
        Str = sprintf('%s - %s: %s\n',datestr(now),typeStr,logStr);
        fprintf(FID,Str);
        fclose(FID);
    end
end

enumeration
    INFO,
    WARNING,
    ERROR
end
end

现在诚然,我没有很多编程经验,所以我可能会以完全错误的方式处理这个问题,尽管我曾尝试用谷歌搜索这个问题但收效甚微——我可能不知道某些特定的关键字会“命中”钉在头上”。这是我的信念,因为需要创建此类的多个实例(以引用不同的文件),“日志”函数需要是非静态的。我在尝试创建此类的实例时收到此错误消息:

Error using LogEvent
While creating an instance of class 'LogEvent':
No value has been provided for the enumeration member named 'INFO'.  For an
enumeration derived from a built-in class, a value must be provided for each
enumeration member.

Error in ZOHB (line 10)
obj.Log = LogEvent('ZOHB.log');

在“ZOHB”类中,我尝试创建 LogEvent 类的实例,并将其分配为 ZOHB 类的属性。

【问题讨论】:

    标签: matlab class methods enumeration non-static


    【解决方案1】:

    在 Matlab 的枚举方案中,枚举值必须是包含该枚举的类的实例。所以例如WARNING 必须是某个 LogEventinstance。

    例如就像文档中的这个例子一样:

    classdef Bearing < uint32
       enumeration
          North (0)
          East  (90)
          South (180)
          West  (270)
       end
    end
    

    这意味着在您的情况下,您必须指定适合您的 LogEvent 构造函数的参数 - 基本上,这就是错误消息所说的内容。 在您的用例中,这当然完全是无稽之谈。

    在您的特殊情况下,您最好将ERRORWARNINGINFO 设为常量属性:

    properties (Constant)
        INFO = 1;
        WARNING = 2;
        ERROR = 3;
    end
    

    您可以以静态方式访问常量,因此您的剩余代码应该可以在此版本中使用。

    【讨论】:

      猜你喜欢
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多