我试图在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类的属性。
答案 0 :(得分:1)
在Matlab的枚举方案中,枚举值必须是包含枚举的类的实例。所以例如WARNING
必须有某个LogEvent
个实例。
E.g。就像在这个例子中的文档:
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
您可以以静态方式访问常量,因此您的剩余代码应该与此版本一起使用。