2013-12-17 44 views
2

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

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

在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 

您可以访问常量以静态方式,所以你剩下的代码应与这个版本相当多的工作。

+0

谢谢!经过测试和工作...... – Charlie