【问题标题】:const string value contents not recognized in constructor [closed]构造函数中无法识别的常量字符串值内容[关闭]
【发布时间】:2015-10-14 13:28:42
【问题描述】:

在 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 文件中尝试过,结果相同。谁能解释一下为什么?

【问题讨论】:

  • 静态初始化惨败?
  • @Nathan - 我的例子有什么问题。没有用大括号包围它以使其成为可编译的类,这基本上就是我想做的一切。
  • 是的,但你没有告诉我们你在哪里调用构造函数。您应该发布最少量的代码来展示行为,以便我们自己尝试。
  • 大胆猜测 - 您的 MyClass 实例也是静态变量吗?

标签: c++ file constructor io constants


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多