2013-12-17 40 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