2016-07-17 18 views
-1

Ich muss einige Variablen zwischen verschiedenen Quelldateien teilen. Jetzt benutze ich namespace wie unten, was ein wenig seltsam erscheint. Hinzufügen von const kann besser sein, aber die globalen Variablen werden zugeordnet durch Laden von configure-Datei zusammen nicht eins für eine Zeit. Daher kann die initializer_list nicht verwendet werden. Gibt es dafür eine bessere Lösung?Wie können globale Variablen in einem Projekt freigegeben werden, wenn sie aus Konfigurationsdateien initialisiert werden müssen?

// configuration.hpp 
#include <string> 

namespace configuration { 

    extern int ni; 
    extern int nk; 
    extern int nt; 
    extern double dt; 

    extern std::string grid_config_file; 
    extern std::string media_config_file; 
    extern std::string source_config_file; 

    void SetConfiguration(const std::string &); 
}; 

// configuration.cc 
#include "configuration.hpp" 
#include <string> 
#include <yaml-cpp/yaml.h> 

namespace configuration { 
    int ni; 
    int nk; 
    int nt; 
    double dt; 

    std::string grid_config_file; 
    std::string media_config_file; 
    std::string source_config_file; 

    void SetConfiguration(const std::string &main_config) { 
    YAML::Node config = YAML::LoadFile(main_config); 

    YAML::Node conf_basic = config["conf_basic"]; 
    ni = conf_basic["ni"].as<int>(); 
    nk = conf_basic["nk"].as<int>(); 
    nt = conf_basic["nt"].as<int>(); 
    dt = conf_basic["dt"].as<double>(); 

    YAML::Node conf_file = config["conf_file"]; 
    grid_config_file = conf_file["grid_conf"].as<std::string>(); 
    media_config_file = conf_file["media_conf"].as<std::string>(); 
    source_config_file = conf_file["source_conf"].as<std::string>(); 
    } 

} 

Die configure-Datei (conf.yaml)

--- 
# The basic parameters 
conf_basic: 
    ni: 100 
    nk: 100 
    nt: 200 
    dt: 0.1 

# The detailed configure files 
conf_file: 
    grid_conf: Grid.yaml 
    media_conf: Media.yaml 
    source_conf: Source.yaml 
+0

Wenn Sie Accessoren anstelle von Variablen verwenden, können Sie den Zugriff auf die Daten steuern. – dgsomerton

Antwort

0

Bitte nehmen Sie sich einen Blick auf Singleton design pattern. Sie können die Variablen in eine öffentliche Klasse einbinden und über eine statische Methode darauf zugreifen. Beim ersten Zugriff initialisieren Sie die Variablen von wo immer Sie benötigen.

+0

Sie meinen, dass es wie http://stackoverflow.com/questions/1008019/c-singleton-design-pattern/1008289#1008289 getan werden kann. Wenn ich diese globalen Variablen in einer Funktion brauche, füge ich einfach 'Configuration conf = Configuration.getInstance(); int ni = conf.ni; 'in der Funktion, ist es richtig? – Aristotle0

+0

@ Aristotle0 Ja, ich schlage vor, Sie auch über dieses Design zu lernen, wie Sie es verwenden werden, aber einer der einfachsten ist. Es besteht darin, dass Sie das Objekt zum ersten Mal benötigen und dann instanziieren, und Sie verwenden immer dasselbe Objekt. Auf diese Weise können Sie die Werte in Ihrem Objekt beibehalten und Getter für diese Werte erstellen. – meJustAndrew

Verwandte Themen