Ich entwickle einen Code zur Simulation des Flüssigkeitsflusses mit im Fluss vorhandenen biologischen Substanzen. Dies beinhaltet die standardmäßigen Navier-Stokes-Gleichungen, die mit einigen zusätzlichen biologischen Modellen gekoppelt sind. Es gibt viele Parameter / Konstanten.
Ich habe Funktionen geschrieben, um die Hauptberechnungen zu handhaben, aber ein Problem, das ich habe, ist die große Anzahl von Konstanten / Parametern, von denen diese Berechnungen abhängen. Es scheint umständlich, 10-20 Argumente an eine Funktion zu übergeben.
Eine Alternative besteht darin, alle Konstanten zu globalen Variablen zu machen, aber ich weiß, dass dies in C ++ verpönt ist.
Wie werden normalerweise viele Eingaben für eine Funktion verarbeitet? Soll ich stattdessen eine Struktur erstellen und diese übergeben?
Vielen Dank
Antworten:
Wenn Sie Konstanten haben, die sich vor dem Ausführen nicht ändern, deklarieren Sie diese in einer Header-Datei:
Der Grund, warum Sie dies tun möchten, besteht darin, dass der Compiler vor der Laufzeit konstante Werte berechnen kann. Dies ist gut, wenn Sie viele davon haben.
Sie können auch eine einfache Klasse verwenden, um Werte weiterzugeben:
quelle
constexpr
machen, schließen Sie sie mindestens in ein ein,namespace
damit sie nicht auf andere globale Symbole treten. Die Verwendung einer aufgerufenen globalen VariablenG
ist nur ein Problem.ifndef PROJECT_NAME_FILE_NAME_EXTENSION
. Sie sind sich auch nicht sicher, warum Sie Konstanten großgeschrieben haben, nicht jedoch Ihre Include-Guard-Makros. Sie möchten im Allgemeinen alle Makros in Großbuchstaben schreiben, vor allem, weil sie nicht hygienisch sind. Für Konstanten ist die Großschreibung im Allgemeinen nicht sinnvoll .G
ist in Ordnung, weil sein SI, aber mass_earth ist geeigneter und sollte mit einem Namespace qualifiziert werden, um global zu kennzeichnen, dhconstants::mass_earth
.Eine andere Alternative, die Ihrem Gedankengang entsprechen könnte, besteht darin, einen Namespace (oder verschachtelte Namespaces) zu verwenden, um Konstanten richtig zu gruppieren. Ein Beispiel könnte sein:
Mit der oben beschriebenen Technik können Sie Referenzkonstanten in einigen gewünschten Dateien und Namespaces lokalisieren, um sie kontrollierter als globale Variablen zu machen und einige ähnliche Vorteile zu erzielen. Wenn Sie die Konstanten verwenden, ist das ganz einfach:
Wenn Sie lange Ketten verschachtelter Namespaces nicht mögen, können Sie die Dinge bei Bedarf jederzeit verkürzen, indem Sie einen Namespace-Alias verwenden:
quelle
Eine Möglichkeit, die ich tue, ist die Verwendung von Singleton.
Wenn Sie Ihr Programm starten, initiieren Sie Ihren Singleton und füllen ihn mit den konstanten Daten (wahrscheinlich aus einer Eigenschaftendatei, die Sie für den Lauf haben). Sie erhalten dies in jeder Klasse, die Sie die Werte benötigen und verwenden Sie es einfach.
quelle