2017-05-15 2 views
1

Ich verwende eine statische Methode, um die const-Felder einer Klasse zu initialisieren. Die statische Methode verwendet einige konstante Variablen, die in einer separaten Header-Datei gespeichert sind. Primitive Typen werden korrekt an die statische Methode übergeben, aber die std :: strings werden leer übergeben. Ich kann nicht verstehen, warum das so ist.Empty std :: string im Initiator der statischen Methode

Nachdem ich ein wenig gesucht habe, bin ich auf etwas gestoßen, das man das statische Initialiser-Fiasko nennt, aber ich habe Probleme, meinen Kopf darum zu wickeln und kann nicht herausfinden, ob es Schuld ist. Da das Objekt im globalen Gültigkeitsbereich ist, ist das Problem, dass es "eingerichtet" wird, bevor die Klasse std :: string "eingerichtet" wurde?

Ich habe versucht, unter ein minimales Beispiel zu replizieren:

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

Vielen Dank!

Antwort

2

Da das Objekt im globalen Gültigkeitsbereich ist, ist das Problem, dass es "Setup" vor der std :: string-Klasse "Setup" ist?

Ja.

Haben Sie Ihre Strings Funktion-static s, durch Verweis von einer Funktion zurückgegeben, stattdessen.

Dies ist die traditionelle Lösung für das statische Initialisierungsauftragsfiasko.

+0

Vielen Dank für die Bestätigung! – user7119460

Verwandte Themen