Пустой std::string в инициализаторе статического метода
Я использую статический метод для инициализации константных полей класса. Статический метод использует некоторые константные переменные, которые хранятся в отдельном заголовочном файле. Примитивные типы правильно передаются статическому методу, но 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);
}
Спасибо большое!
1 ответ
Поскольку объект находится в глобальной области видимости, является ли проблема в том, что он "настраивается" до того, как класс std::string был "настроен"?
Да.
Ваши строки должны быть функциональнымиstatic
s, возвращается по ссылке из некоторой функции.
Это традиционное исправление фиаско статического порядка инициализации.