2012-04-17 129 views
1

我有一个类别C1与公共成员如何初始化std :: ofstream的静态引用?

static std::ofstream &_rout;

在主文件

ofstream out("output.txt"); 
ofstream& Cl::_rout(out); 

但我有一个编译错误:非法定义或重新定义。 我该如何纠正它?

+2

这[对我的作品(http://ideone.com/ujN6D)。你能否提供一个失败代码的完整示例,以及完整的错误消息? – 2012-04-17 15:42:26

回答

3

只能在静态/全球范围内

#include<CL.h> 
ofstream& Cl::_rout(out); 
int main() { 
    // ... 
} 

这是不可能重新设置它被宣布后(并初始化)的参考设置的参考。你可以实现你是什么后,使用指针,而不是引用:

class Cl { 
    static std::ofstream* _rout; 
}; 
std::ofstream* CL::_rout = NULL; 

int main() { 
    ofstream out("output.txt"); 
    Cl::_rout = &out; 
} 

注意,指针会只有等到out超出范围有效。如果这是一个问题,动态分配内存:

ofstream* out = new ofstream("output.txt"); 
    Cl::_rout = out; 

而且不要忘了delete它时,你不再需要的对象以避免内存泄漏

0

嗯,你可以用下面的办法:

#include <fstream> 

class CI 
{ 
public: 
    static std::ofstream &_rout; 
}; 

static std::ofstream out("output.txt"); 

std::ofstream& CI::_rout = out; 

int main() 
{ 
} 

但是,这个问题的问题是输出文件的名称是固定的(硬编码到程序中)。

我建议你使用,而不是一个参考指针:

#include <cstddef> 
#include <fstream> 

class CI 
{ 
public: 
    static std::ofstream *_rout; 
}; 

std::ofstream* CI::_rout = NULL; 

int main() 
{ 
    const char *output_file = "output.txt"; 
    std::ofstream out(output_file); 
    CI::_rout = &out; 
}