我正在尝试将枚举类与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: %sn',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类的属性。
在Matlab的枚举方案中,枚举值必须是包含枚举的类的实例。因此,例如WARNING
将必须具有某个LogEvent
实例。
例如,如文档中的示例:
classdef Bearing < uint32
enumeration
North (0)
East (90)
South (180)
West (270)
end
end
这意味着在您的情况下,您必须指定适合LogEvent构造函数的参数——这基本上就是错误消息所说的。当然,在您的用例中,这完全是无稽之谈。
在您的特殊情况下,您最好使ERROR
、WARNING
和INFO
的属性为常数:
properties (Constant)
INFO = 1;
WARNING = 2;
ERROR = 3;
end
您可以以静态方式访问常量,因此您剩余的代码应该可以与此版本配合使用。