2015-10-14 45 views
-3

不能覺察Myclass.cpp:常量字符串值內容構造

const std::string FILE_NAME = "C:\\MyFileName.txt"; 

MyClass::MyClass() 
{ 
    ifstream fileToOpen; 
    fileToOpen.open(FILE_NAME); //FILE_NAME shows "" in debug 
} 

MyClass::OpenFile() 
{ 
    ifstream fileToOpen; 
    fileToOpen.open(FILE_NAME); //when called from another location, this resolves to proper file name. 
} 

我試圖打開在構造函數中的一個文件。當我在該文件名上調用open函數時,常量變量解析爲"",但是如果函數在其他地方調用,則它工作得很好。我已經在.h文件中使用了相同的結果。誰能解釋爲什麼?

+3

靜態初始化失敗? –

+4

請**用[mcve]或[SSCCE(Short,Self Contained,Correct Example)](http://sscce.org)**你的問題 – NathanOliver

+0

@Nathan - 我的例子有什麼問題。沒有使用大括號將它變成一個可編輯的課程,這基本上是我想要做的一切。 – Jason

回答

4

看來這是因爲初始化順序。該標準說(§3.6.2/ 2)

變量與單個轉換單元中定義的有序初始化是(具有靜態存儲持續時間或線程存儲持續時間有關的變量)須於命令及其定義 初始化在翻譯單位。 < ...>否則,相對於在不同翻譯單元中定義的變量的初始化 ,變量的初始化被不確定地排序。

兩個FILE_NAMEMyClass全局實例具有靜態存儲時間,如果他們碰巧在不同的翻譯單位,他們的初始化順序是不確定的。所以我想你的情況下MyClass類型的全局變量在FILE_NAME之前被初始化。

0

解決此問題的一種方法是使用返回文件名而不是使用變量的函數。

static std::string getFileName() 
{ 
    return "C:\\MyFileName.txt"; 
} 

MyClass::MyClass() 
{ 
    ifstream fileToOpen; 
    fileToOpen.open(getFileName()); 
}