<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Problem mit Namespace und static member variables]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Ich habe ein folgendermaßen deklarierte Klasse (in integrand23.h):</p>
<pre><code>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);
};
</code></pre>
<p>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 &quot;erinnert&quot;. Deswegen dieser Ansatz, keine Ahnung ob das toll ist oder nicht, aber vielleicht immer noch besser als globale Variablen.</p>
<p>Die Datei &quot;integrand23.cpp&quot; enthält dann unter anderem folgendes:</p>
<pre><code>#include &quot;integrand23.h&quot;

// definition of the static member variables of the class integrand23
// these can then be set by e.g. main() via 
// integrand23::md2 = &lt;value&gt;

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;
}
</code></pre>
<p>Von der übergeordneten Routine aus kann ich dann zunächst die statischen Elementvariablen auf Werte setzen und dann die Memberfunktion integrand(..) übergeben.<br />
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:</p>
<pre><code>error: definition of 'integrand23::md2' is not in namespace enclosing 'integrand23'
</code></pre>
<p>usw. auch für die anderen statischen Membervariablen..</p>
<p>Was läuft falsch? Was an der Konstruktion ist nicht standardkonform? Bin da leider kein Experte und wäre für Anregungen sehr dankbar.</p>
<p>Viele Grüße!<br />
Oliver</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/185355/problem-mit-namespace-und-static-member-variables</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 03:27:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/185355.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 24 Jun 2007 16:18:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Namespace und static member variables on Sun, 24 Jun 2007 16:18:16 GMT]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Ich habe ein folgendermaßen deklarierte Klasse (in integrand23.h):</p>
<pre><code>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);
};
</code></pre>
<p>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 &quot;erinnert&quot;. Deswegen dieser Ansatz, keine Ahnung ob das toll ist oder nicht, aber vielleicht immer noch besser als globale Variablen.</p>
<p>Die Datei &quot;integrand23.cpp&quot; enthält dann unter anderem folgendes:</p>
<pre><code>#include &quot;integrand23.h&quot;

// definition of the static member variables of the class integrand23
// these can then be set by e.g. main() via 
// integrand23::md2 = &lt;value&gt;

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;
}
</code></pre>
<p>Von der übergeordneten Routine aus kann ich dann zunächst die statischen Elementvariablen auf Werte setzen und dann die Memberfunktion integrand(..) übergeben.<br />
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:</p>
<pre><code>error: definition of 'integrand23::md2' is not in namespace enclosing 'integrand23'
</code></pre>
<p>usw. auch für die anderen statischen Membervariablen..</p>
<p>Was läuft falsch? Was an der Konstruktion ist nicht standardkonform? Bin da leider kein Experte und wäre für Anregungen sehr dankbar.</p>
<p>Viele Grüße!<br />
Oliver</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312851</guid><dc:creator><![CDATA[janitor]]></dc:creator><pubDate>Sun, 24 Jun 2007 16:18:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Namespace und static member variables on Sun, 24 Jun 2007 16:21:26 GMT]]></title><description><![CDATA[<p>wozu das Namespace?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312854</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Sun, 24 Jun 2007 16:21:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Namespace und static member variables on Sun, 24 Jun 2007 16:33:52 GMT]]></title><description><![CDATA[<p>ähh, ja, gute Frage. Ich hab mir das so stückweise zusammengebastelt...</p>
<p>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.<br />
Habe aber auch das Gefühl, dass es irgendwie besser gehen muss.</p>
<p>Ziel ist wie gesagt folgendes - von einer anderen Übersetzungseinheit aus:</p>
<pre><code>#include &quot;integrand23.h&quot;

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);

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1312868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312868</guid><dc:creator><![CDATA[janitor]]></dc:creator><pubDate>Sun, 24 Jun 2007 16:33:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Namespace und static member variables on Sun, 24 Jun 2007 16:47:11 GMT]]></title><description><![CDATA[<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312880</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Sun, 24 Jun 2007 16:47:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Namespace und static member variables on Mon, 25 Jun 2007 06:53:52 GMT]]></title><description><![CDATA[<p>Und eine Klasse, die nur aus statischen Membern besteht, erscheint mir auch ein wenig seltsam.</p>
<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1313114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313114</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 25 Jun 2007 06:53:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Namespace und static member variables on Mon, 25 Jun 2007 07:14:32 GMT]]></title><description><![CDATA[<p>wenns schon ums umdesignen geht, dann würd ich aus der &quot;statischen klasse&quot; ne stinkordinäre klasse machen.</p>
<p>das ergebnis von integrand() ändert sich, abhängig von den gesetzten parametern. das allein rechtfertig meiner meinung nach eine instanziierung der klasse vor nutzung.</p>
<pre><code class="language-cpp">integrand23 parametrisierteMethode1;
integrand23 parametrisierteMethode2;
// parameter setzen
parametrisierteMethode1.integrand(...);
parametrisierteMethode2.integrand(...);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1313125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313125</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Mon, 25 Jun 2007 07:14:32 GMT</pubDate></item></channel></rss>