2010-07-06 67 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