2010-07-06 31 views
0

遇到我所做的自定義日誌記錄系統的問題。我在我的主文件中聲明瞭一個ofstream,以便它可以在我的類中用靜態函數訪問。這適用於我的靜態功能(ilra_log_enabled)。但是,這對我的類的重載函數不起作用。我收到「日誌文件」錯誤的未定義引用。對外部變量的未定義引用

任何想法?

#ifndef ILRA_H_ 
#define ILRA_H_ 

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

// Namespace 
using namespace std; 

// Classes 
class ilra 
{ 
    static int ilralevel_set; 
    static int ilralevel_passed; 
    static bool relay_enabled; 
    static bool log_enabled; 
    static ofstream logfile; 
public: 
    // constructor/destructor 
    ilra(const std::string &funcName, int toset) 
    { 
     // we got passed a loglevel! 
     ilralevel_passed = toset; 
    } 
    ~ilra(){}; 

    static void ilra_log_enabled(bool toset){ 
     log_enabled = toset; 

     if (log_enabled == true){ 
      // get current time 
      time_t rawtime; 
      time (&rawtime); 

      // name of log file 
      string logname = "rclient-"; 
      logname.append(rawtime + ".txt"); 

      // open a log file 
      logfile.open(logname.c_str()); 
     } 
    } 

    // output 
    template <class T> 
    ilra &operator<<(const T &v) 
    { 
     if(ilralevel_passed <= ilralevel_set) 
      std::cout << v; 
     if(log_enabled == true) 
      logfile << "Test"; // undefined reference to ilra::logfile 
     return *this; 
    } 

}; // end of the class 

#endif /* ILRA_H_ */ 
+0

你爲什麼不把'logfile'聲明爲你的類的靜態成員? – 2010-07-06 07:19:19

+0

@Vijay,我已經提前修改了程序結構,以便所有變量都是該類的成員。這解決了這個問題。由於之前的問題,我使用這種其他組織風格來封裝所有變量。 – BSchlinker 2010-07-06 08:52:31

回答

0

我將變量移到類中並解決了問題。仍然不確定以前的方法出了什麼問題。

0

我認爲問題在於你在重載方法中聲明logfile。它已經在全局聲明,並通過在隱藏全局實例的方法中聲明它。

由於你的其他用途logfile的作品,我想你有一個ofstream logfile;聲明在某個cpp文件的某處。

+0

從重載方法中刪除日誌文件的聲明不能解決問題(我最初沒有在重載函數中聲明它) – BSchlinker 2010-07-06 07:20:19

0

extern關鍵字用於通知編譯器有關在當前作用域外聲明的變量。一個聲明使用extern不要定義的變量。外部變量具有靜態持續時間(在程序開始時分配,在程序結束時釋放),並具有全局可見性。所以你需要定義一個extern變量,就像你做一個靜態變量一樣,在一個編譯單元(一個cpp文件,最理想的情況是你已經定義了main()函數的文件)的範圍內。做這樣的事情將解決您的問題:

#include "ilra.h" 

ofstream logfile("test.log"); // declare and define the global variable. 

int main() 
{ 
    ilra i("hello", 1); 
    i.operator<< <int> (10); 
    return 0; 
} 
+0

這正是我已經完成的工作。我在我的主文件中聲明ofstream日誌文件,然後在我的類中修改它。 (請不要把我的評論看作否定的,我很欣賞這個建議) – BSchlinker 2010-07-06 07:41:22

+0

我認爲他的意思是在頭文件'extern ofstream logfile;'中聲明它,然後在'main()'方法之外定義它,因爲他描述。這對我有效。 – tir38 2013-07-06 22:10:17