const字符串值内容在构造函数中无法识别

时间:2015-10-14 13:28:43

标签: c++ file constructor io constants

在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文件中尝试了相同的结果。任何人都可以解释原因吗?

2 个答案:

答案 0 :(得分:4)

这似乎是因为初始化顺序而发生的。标准说(§3.6.2/ 2)(关于具有静态存储持续时间或线程存储持续时间的变量)

  

在单个翻译单元中定义的具有有序初始化的变量应按顺序初始化   他们在翻译单位的定义。 < ...>否则,变量的初始化相对于初始化是不确定地排序的   在不同的翻译单元中定义的变量。

FILE_NAMEMyClass的全局实例都具有静态存储持续时间,如果它们恰好位于不同的转换单元中,则它们的初始化顺序是未定义的。所以我想在你的情况下,MyClass类型的全局变量在FILE_NAME之前被初始化。

答案 1 :(得分:0)

解决问题的一种方法是使用一个返回文件名而不是使用变量的函数。

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

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