静态方法初始化程序中的空 std::string

Empty std::string in static method initialiser

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

在进行一些搜索后,我偶然发现了一种称为静态初始化程序失败的东西,但我无法解决这个问题,也无法解决是否是罪魁祸首。由于对象在全局范围内,问题是它在 std::string class 之前 'setup' 已经 'setup' 了吗?

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

// 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);
}

非常感谢!

As the the object is in global scope, is the problem that it is being 'setup' before the std::string class has been 'setup'?

是的。

让你的字符串成为函数-statics,而不是通过引用从某个函数返回。

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