Matlab - 将枚举类与非静态方法相结合

时间:2013-12-17 04:03:45

标签: matlab class methods enumeration non-static

我试图在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

现在可以肯定的是,我没有很多编程经验,所以我可能会以完全错误的方式接近这个,虽然我已经尝试使用谷歌搜索这个问题,但收效甚微 - 我可能不知道一些特定的关键词钉在头上'。我相信这是因为需要创建这个类的多个实例(引用不同的文件),'log'函数需要是非静态的。我收到此错误消息尝试创建此类的实例:

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类的属性。

1 个答案:

答案 0 :(得分:1)

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

E.g。就像在这个例子中的文档:

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

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