2010-06-18 53 views
1

我開發了一個'自定義'cout,以便我可以向控制檯顯示文本並將其打印到日誌文件。這個cout類在初始化時傳遞了一個不同的整數,整數代表了消息的詳細程度。如果當前的詳細級別大於或等於消息的詳細級別,則應打印該消息。IF聲明有奇怪的行爲

問題是,即使當前詳細程度級別太低,我也會打印郵件。我繼續調試它,期待找到問題。相反,我發現了多個場景,其中我的if語句無法按預期工作。

if(ilralevel_passed < = ilralevel_set)語句有時會繼續,即使ilralevel_set是LESS,然後ilralevel_passed。你可以在下面的圖片中看到這種行爲(我使用Twitpic道歉)http://twitpic.com/1xtx4g/full。注意ilralevel_set等於零,ilralevel_passed等於1。然而,if語句已經恢復正確,現在正在向前推進,以便將該線路傳遞給cout。

我從來沒有見過這種類型的行爲,我不確定如何繼續調試它。我無法隔離行爲 - 它只發生在我的程序的某些部分。任何建議都會受到讚賞。

// Here is an example use of the function: 
// ilra_status << setfill('0') << setw(2) << dispatchtime.tm_sec << endl; 
// ilra_warning << "Dispatch time (seconds): " << mktime(&dispatchtime) << endl; 

// Here is the 'custom' cout function: 
    #ifndef ILRA_H_ 
    #define ILRA_H_ 

    // System libraries 
    #include <iostream> 
    #include <ostream> 
    #include <sstream> 
    #include <iomanip> 

    // Definitions 
    #define ilra_talk ilra(__FUNCTION__,0) 
    #define ilra_update ilra(__FUNCTION__,0) 
    #define ilra_error ilra(__FUNCTION__,1) 
    #define ilra_warning ilra(__FUNCTION__,2) 
    #define ilra_status ilra(__FUNCTION__,3) 

    // Statics 
    static int ilralevel_set = 0; 
    static int ilralevel_passed; 

    // Classes 
    class ilra 
    { 
    public: 
     // constructor/destructor 
     ilra(const std::string &funcName, int toset) 
     { 
      ilralevel_passed = toset; 
     } 
     ~ilra(){}; 

     // enable/disable irla functions 
     static void ilra_verbose_level(int toset){ 
      ilralevel_set = toset; 
     } 

     // output 
     template <class T> 
     ilra &operator<<(const T &v) 
     { 
      if(ilralevel_passed <= ilralevel_set) 
       std::cout << v; 
      return *this; 
     } 

     ilra &operator<<(std::ostream&(*f)(std::ostream&)) 
     { 
      if(ilralevel_passed <= ilralevel_set) 
       std::cout << *f; 
      return *this; 
     } 

    }; // end of the class 

    #endif /* ILRA_H_ */ 

回答

6

當你在一個類的外面定義一個靜態變量時,你爲每個包含頭文件的源文件定義了一個單獨的變量 - 改變其中的值不會影響變量的值名稱在另一個文件中。

你幾乎肯定需要的是有

int ilralevel_set = 0; 
int ilralevel_passed; 

一個文件,其中你定義你的對象,並且:

extern int ilralevel_set; 
extern int ilralevel_passed; 
在頭

。或者,它看起來像你可以把它全部在類中:

class ilra { 
    int passed_level; 
    int set_level; 
public: 
    ilra(int toset) : passed_level(toset), set_level(0) {} 

    verbose_level(int toset) { set_level = toset; } 
    // ... 
}; 
+0

移動類中的整數將使我的靜態函數無法使用它們。由於我不創建對象並直接調用類中的函數,因此這是一項要求。如果我要創建一個對象,我需要不斷爲每個單獨的對象創建它。 – BSchlinker 2010-06-18 16:04:33

+0

@BSchlinker:如果你不創建一個對象,你爲什麼要使用一個類?對於這樣的情況,你可能只需要在命名空間中有函數(和變量)。 – 2010-06-18 16:07:00

+0

我嘗試阻止使用全局變量(這是我知道的用於在兩個獨立函數之間存儲變量的唯一方法)。我對命名空間的用法也不是很熟悉。 請參閱:http://stackoverflow.com/questions/3035582/static-variables-in-overloaded-functions – BSchlinker 2010-06-18 16:16:32

5

你不應該定義靜態變量在頭文件是這樣的:

static int ilralevel_set = 0; 
static int ilralevel_passed; 

我不知道你怎麼想的定義做,但他們可能是你想要什麼都不做。

要聲明的類:

struct A { 
    static int ilralevel; 
}; 

然後,您需要在一個的.cpp源文件來定義:

int A::ilralevel = 0; 
+0

我怎麼能把它們定義爲靜態變量?你不能在類中定義它們(這實際上是另一個答案,這導致我在頭文件中定義它們) – BSchlinker 2010-06-18 15:45:14

+1

@BSchlinker我真的不明白你在做什麼,但你可以定義它們在班上。 – 2010-06-18 15:47:58

+0

@尼爾 - 不,你不能。你可以聲明它們。在積分的情況下,你可以初始化它們。你不能定義它們;不在類聲明中。 – 2010-06-18 16:04:06

1

只是一個猜測..你得到的不同副本你的靜態全局變量在不同的編譯單元中。 fx,route.cpp有自己的副本ilralevel_passedilralevel_set,加上irla::operator<<的內聯副本。將ilralevel_passed移動到irlailralevel_set的成員變量爲static const,然後查看是否有幫助。