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.
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
Wenn Sie wirklich globale Daten möchten, betrachten Sie Singleton (anti) Muster: https://en.wikipedia.org/wiki/Singleton_pattern – Sergey
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. –