2012-04-17 71 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; 
}