【问题标题】:Empty std::string in static method initialiser静态方法初始化程序中的空 std::string
【发布时间】:2017-05-15 20:12:05
【问题描述】:

我正在使用静态方法来初始化类的 const 字段。静态方法使用一些 const 变量,这些变量存储在单独的头文件中。原始类型正确地传递给静态方法,但 std::strings 被传递为空。我不明白为什么会这样。

在进行了一些搜索之后,我偶然发现了一种叫做静态初始化程序失败的东西,但是我很难理解它,并且无法确定是否应该归咎于它。由于对象在全局范围内,问题是在 std::string 类被“设置”之前它正在“设置”吗?

我试图复制下面的一个最小示例:

// File: settings.hpp
#include <string>
const std::string TERMINAL_STRING "Printing to the terminal";
const std::string FILE_STRING "Printing to a file";


// File: printer.hpp
#include <string>
#include <iostream>

class Printer
{
    private:
        const std::string welcomeMessage;
        static std::string initWelcomeMessage(std::ostream&);

    public:
        Printer(std::ostream&);
}

extern Printer::print;


// File: printer.cpp
#include "settings.hpp"

std::string Printer::initWelcomeMessage(std::ostream &outStream)
{
    if (&outStream == &std::cout)
    {
        return (TERMINAL_STRING);
    }
    else
    {
        return (FILE_STRING);
    }
}

Printer::Printer(std::ostream &outStream) :
    message(initWelcomeMessage(outStream)
{
    outStream << welcomeMessage << std::endl;

    return;
}


// File: main.cpp
#include "printer.hpp"

printer print(std::cout);

int main()
{
    return (0);
}

非常感谢!

【问题讨论】:

    标签: c++ class initialization c++14 static-initialization


    【解决方案1】:

    由于对象在全局范围内,问题是它在 std::string 类被“设置”之前被“设置”吗?

    是的。

    让您的字符串为 function-statics,而是通过某个函数的引用返回。

    这是静态初始化顺序失败的传统修复方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 2016-10-05
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多