2016-07-12 19 views
0

Ich versuche, einen guten Weg, um herauszufinden, Daten über mehrere Dateien zu teilen, aber ich bin sicher, dass einige Methoden besser sind als andere, so dass ich komme hier zu fragen, was die sichersten Wege sind Daten auf diese Weise zu teilen . Im folgende Beispiel werde ich zeigen, wie ich habe es getan, bis jetzt, aber ich fühle mich wie das ist nicht wirklich der beste Weg, dies zu tun.C++ Gute Praktiken, um Variablen in Dateien zu teilen?

Nehmen wir ein Beispiel nehmen, wo ich 5 Dateien haben: file1.h, file1.cpp, file2.h file2.cpp und main.cpp. Sie könnten wie folgt aussehen:

//main.cpp 
#include "file1.h" 
#include "file2.h" 

int main(){ 
    PushOne pushOne; 
    PushTwo pushTwo; 

    pushOne.Push(); 
    pushTwo.Push(); 

    for (int i =0; i<q.size(); i++){ 
     std::cout << q.front() << std::endl; 
     q.pop(); 
    } 
    return 0; 
} 

//file1.h 
namespace Foo{ 

    extern std::queue<int> q; //resource to be shared across files 

    class PushOne{ 
    public: 
     void Push(); 
    }; 

} 

//file1.cpp 
#include "file1.h" 
namespace Foo{ 

    std::queue<int> q; 

    void PushOne::Push(){ 
     q.push(1); 
    } 
} 

//file2.h 
#include "file1.h" //#include this to have access to namespace variables declared in this file...Seems sort of inefficient 
namespace Foo{ 

    class PushTwo{ 
    public: 
     void Push(); 
    }; 
} 

//file2.cpp 
#include "file2.h" 

namespace Foo{ 
    void PushTwo::Push(){ 
     q.push(2); 
    } 
} 

Also hier habe ich eine Namespace-Variable std :: Warteschlange q, die ich will sowohl in file1 und file2 zuzugreifen. Es scheint nicht sinnvoll zu sein, dass ich diese Namespace-Variable in eine der beiden Dateien schreiben und die andere Datei einfach # einschließen sollte. Gibt es eine bessere Methode, dies zu tun? Dies scheint eine Art "unsymmetrischen" Zugriff auf die std::queue<int> q zu gewähren. Ich weiß nicht einmal, ob dies notwendigerweise eine negative Sache ist, aber vielleicht etwas Licht auf der Effizienz dieser Methode oder schlägt eine andere Methode könnte jemand vergießen.

+2

Globale veränderbare Daten sehen aus wie nicht sehr gute Idee. Sehen Sie sich einige Erläuterungen zu SE an: http://stackoverflow.com/questions/484635/are-global-variables-bad, http://programmers.stackexchange.com/questions/148108/why-is-global-state -so böse. Namespacing macht globale Daten nicht weniger global. – Sergey

+1

Wenn Sie wirklich globale Daten möchten, betrachten Sie Singleton (anti) Muster: https://en.wikipedia.org/wiki/Singleton_pattern – Sergey

+1

Sie können und sollten eine [Sperre] (http://www.cplusplus.com/reference) verwenden/mutex/mutex/lock /), um sicherzustellen, dass Ihre Warteschlange Thread-sicher ist, nachdem Sie alle diese Vorschläge befolgt haben. –

Antwort

2

Wenn Sie das wirklich tun wollen, eine Struktur mit einem statischen Elemente in einer Header-Datei definiert werden:

MyQueue.h:

struct MyQueue { 
    static std::queue<int> q; 
} 

Sie werden auch die Variable zu definieren haben in eine entsprechende CPP-Datei.

MyQueue.cpp:

#inclue "MyQueue.h" 

static std::queue<int> MyQueue::q; 

Sie können es mit jeder Datei zugreifen, einschließlich diesen Header, zum Beispiel:

MyQueue::q.push(2); 

Noch ist etwas, das ich nicht empfehlen würde, vor allem, wenn Es gibt mehrere Threads, da es sich um eine globale Variable handelt.

Eine andere Option wäre die Verwendung eines Singleton, aber dies hat die gleichen Probleme.