Problem mit Namespace und static member variables
-
Hallo zusammen!
Ich habe ein folgendermaßen deklarierte Klasse (in integrand23.h):
class integrand23 { public: static double md2; static double lambdaf; static double beta_dash; static double cos_theta; static void integrand(const int *ndim, const double xx[], const int *ncomp, double ff[]); static double integrand_nr(double xx[], double wgt); };Ist alles static damit ich das ganze nutzen kann, ohne ein Objekt zu erzeugen. Sinn ist der, dass ich die funktion integrand23::integrand(...) an eine andere Routine übergeben möchte. Allerdings müssen vor der Übergabe gewisse Parameter gesetzt werden, an die sich die Funktion integrand(..) dann "erinnert". Deswegen dieser Ansatz, keine Ahnung ob das toll ist oder nicht, aber vielleicht immer noch besser als globale Variablen.
Die Datei "integrand23.cpp" enthält dann unter anderem folgendes:
#include "integrand23.h" // definition of the static member variables of the class integrand23 // these can then be set by e.g. main() via // integrand23::md2 = <value> namespace { double integrand23::md2; double integrand23::lambdaf; double integrand23::beta_dash; double integrand23::cos_theta; } void integrand23::integrand(const int *ndim, const double xx[], const int *ncomp, double ff[]) { blabla; }Von der übergeordneten Routine aus kann ich dann zunächst die statischen Elementvariablen auf Werte setzen und dann die Memberfunktion integrand(..) übergeben.
So zumindest der Plan. Und mit g++ 3.3.5 (und ich glaube auch mit 4.0.2) funktioniert das auch wie gewünscht. Mit 4.1.2 (und KDevelop 3.4.0) bekomme ich jetzt aber folgende Fehlermeldung:error: definition of 'integrand23::md2' is not in namespace enclosing 'integrand23'usw. auch für die anderen statischen Membervariablen..
Was läuft falsch? Was an der Konstruktion ist nicht standardkonform? Bin da leider kein Experte und wäre für Anregungen sehr dankbar.
Viele Grüße!
Oliver
-
wozu das Namespace?
-
ähh, ja, gute Frage. Ich hab mir das so stückweise zusammengebastelt...
Muss halt bspw. integrand23::md2 auch irgendwo definieren, bevor ich es verwende. Das geschieht dann wohl innerhalb des unbenannten Namespaces. Und der Namespace deshalb, damit es keine globalen Variablen über mehrere Übersetzungseinheiten werden.
Habe aber auch das Gefühl, dass es irgendwie besser gehen muss.Ziel ist wie gesagt folgendes - von einer anderen Übersetzungseinheit aus:
#include "integrand23.h" void eineFunktion() { integrand23::md2 = WERT; integrand23::lambdaf = WERT; integrand23::beta_dash = WERT; integrand23::cos_theta = WERT; // Aufruf der Funktion, welche die Member-Funktion integrand() als Argument benötigt... als Zeiger auf die Funktion genau genommen andereFunktion(integrand23::integrand); }
-
das design erscheint mir bisschen seltsam, aber egal. schmeiss den ganzen namespace block einfach raus, den brauchst du nicht und der erfüllt auch keine funktion.
-
Und eine Klasse, die nur aus statischen Membern besteht, erscheint mir auch ein wenig seltsam.
Dein Kernproblem ist, daß die gesamte Klasse integrand23 im globalen Namensraum liegt - da kannst du ihre Member nicht nachträglich in einen Unter-Namensraum umlagern (besonders nachdem du auch vorhast, aus anderen Programmteilen direkt auf die Member zuzugreifen). Lass die Klasse lieber weg und ersetze sie durch einen Namensraum.
-
wenns schon ums umdesignen geht, dann würd ich aus der "statischen klasse" ne stinkordinäre klasse machen.
das ergebnis von integrand() ändert sich, abhängig von den gesetzten parametern. das allein rechtfertig meiner meinung nach eine instanziierung der klasse vor nutzung.
integrand23 parametrisierteMethode1; integrand23 parametrisierteMethode2; // parameter setzen parametrisierteMethode1.integrand(...); parametrisierteMethode2.integrand(...);