<?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[Statische Variable in Klasse]]></title><description><![CDATA[<p>Hi!</p>
<p>Hab gerade ein Problem, wo ich einfach nicht dahinterkomme <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Es geht um folgendes:<br />
Ich habe eine Projektmappe mit mehreren Projekten. Die meisten der Projekte werden als statische Libs erstellt und von anderen eingebunden.<br />
Um das Ganze zu vereinfachen, nehmen wir einfach mal 2 Projekte an, eins wird zur Lib erstellt, das andere bindet sie ein, die Projektabhängigkeit ist gesetzt.<br />
(Ich weiß nicht, ob das mit den Projekten eine Rolle spielt, aber mehr Input -&gt; mehr Output :))</p>
<p>So, in Projekt A gibts eine Klasse C mit statischer Variable (vector). In diese Liste werden Objekte eingetragen mit einem Aufruf an die statische Funktion &quot;static void AddObserver( Observer* pObserver )&quot;, welche den Pointer einfach in die Liste pusht.</p>
<p>In Projekt B trage ich irgendwo (Event) ein Objekt mit &quot;AddObserver&quot; ein und starte anschließend einen neuen Thread, in dem dann die Klasse C mit der statischen Liste erstellt wird.</p>
<p>Nachdem ich den Pointer eingetragen hab, ist die Größe der Liste mit Sicherheit 1.<br />
Wenn ich in der Klasse C nun (in dem anderen Thread) auf die statische Variable zugreife, ist der Vektor leer... Warum?</p>
<p>Ich komme einfach nicht dahinter, erschließt sich mir irgendwie nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Debuggen kann ich nicht, dazu ist das Programm viel zu langsam (dauert dann &gt; 2 Stunden zum Laden), außerdem gruselts mich vorm Debuggen in Multithreading-Anwendungen...</p>
<p>Hat da jemand eine Idee? Entweder seh ich den Wald vor lauter Bäumen nicht, oder es ist wohl wieder Zeit, was dazuzulernen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Herzlichsten Dank im voraus,<br />
Badestrand</p>
<p>PS: Ein paar Sachen hab ich schon probiert/überlegt.<br />
- An Threads dürfte es nicht liegen, ergibt für mich keinen Sinn.<br />
- Die Variable dürfte sich ja eigentlich nicht bei der Erstellung von Klasse A zurücksetzen, beziehe mich hierbei auf folgenden Test:</p>
<pre><code class="language-cpp">class Bla
{
public:
	static int a;
	static void Inc() { a++; }
};
int Bla::a = 0;

void main()
{
	Bla::Inc();
	std::cout &lt;&lt; Bla::a &lt;&lt; std::endl;
	Bla xx;
	std::cout &lt;&lt; Bla::a &lt;&lt; std::endl;
	Bla::Inc();
	std::cout &lt;&lt; Bla::a &lt;&lt; std::endl;
}
// 1 1 2
</code></pre>
<p>- Und, wenn ich die Variable nicht statisch in der Klasse erstelle, sondern einfach in die Cpp-Datei schreibe, gehts auch nicht... Habs mir gedacht, aber trotzdem einfach mal ausprobiert...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/184476/statische-variable-in-klasse</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 17:37:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/184476.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 15 Jun 2007 15:20:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Statische Variable in Klasse on Fri, 15 Jun 2007 15:24:46 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Hab gerade ein Problem, wo ich einfach nicht dahinterkomme <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Es geht um folgendes:<br />
Ich habe eine Projektmappe mit mehreren Projekten. Die meisten der Projekte werden als statische Libs erstellt und von anderen eingebunden.<br />
Um das Ganze zu vereinfachen, nehmen wir einfach mal 2 Projekte an, eins wird zur Lib erstellt, das andere bindet sie ein, die Projektabhängigkeit ist gesetzt.<br />
(Ich weiß nicht, ob das mit den Projekten eine Rolle spielt, aber mehr Input -&gt; mehr Output :))</p>
<p>So, in Projekt A gibts eine Klasse C mit statischer Variable (vector). In diese Liste werden Objekte eingetragen mit einem Aufruf an die statische Funktion &quot;static void AddObserver( Observer* pObserver )&quot;, welche den Pointer einfach in die Liste pusht.</p>
<p>In Projekt B trage ich irgendwo (Event) ein Objekt mit &quot;AddObserver&quot; ein und starte anschließend einen neuen Thread, in dem dann die Klasse C mit der statischen Liste erstellt wird.</p>
<p>Nachdem ich den Pointer eingetragen hab, ist die Größe der Liste mit Sicherheit 1.<br />
Wenn ich in der Klasse C nun (in dem anderen Thread) auf die statische Variable zugreife, ist der Vektor leer... Warum?</p>
<p>Ich komme einfach nicht dahinter, erschließt sich mir irgendwie nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Debuggen kann ich nicht, dazu ist das Programm viel zu langsam (dauert dann &gt; 2 Stunden zum Laden), außerdem gruselts mich vorm Debuggen in Multithreading-Anwendungen...</p>
<p>Hat da jemand eine Idee? Entweder seh ich den Wald vor lauter Bäumen nicht, oder es ist wohl wieder Zeit, was dazuzulernen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Herzlichsten Dank im voraus,<br />
Badestrand</p>
<p>PS: Ein paar Sachen hab ich schon probiert/überlegt.<br />
- An Threads dürfte es nicht liegen, ergibt für mich keinen Sinn.<br />
- Die Variable dürfte sich ja eigentlich nicht bei der Erstellung von Klasse A zurücksetzen, beziehe mich hierbei auf folgenden Test:</p>
<pre><code class="language-cpp">class Bla
{
public:
	static int a;
	static void Inc() { a++; }
};
int Bla::a = 0;

void main()
{
	Bla::Inc();
	std::cout &lt;&lt; Bla::a &lt;&lt; std::endl;
	Bla xx;
	std::cout &lt;&lt; Bla::a &lt;&lt; std::endl;
	Bla::Inc();
	std::cout &lt;&lt; Bla::a &lt;&lt; std::endl;
}
// 1 1 2
</code></pre>
<p>- Und, wenn ich die Variable nicht statisch in der Klasse erstelle, sondern einfach in die Cpp-Datei schreibe, gehts auch nicht... Habs mir gedacht, aber trotzdem einfach mal ausprobiert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306668</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 15 Jun 2007 15:24:46 GMT</pubDate></item><item><title><![CDATA[Reply to Statische Variable in Klasse on Fri, 15 Jun 2007 18:52:07 GMT]]></title><description><![CDATA[<p>Keiner eine Idee? Eigentlich müsste es doch funktionieren oder nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306813</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 15 Jun 2007 18:52:07 GMT</pubDate></item><item><title><![CDATA[Reply to Statische Variable in Klasse on Fri, 15 Jun 2007 19:17:41 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>(Ich weiß nicht, ob das mit den Projekten eine Rolle spielt, aber mehr Input -&gt; mehr Output :))</p>
</blockquote>
<p>gib uns mal ein minmal non-working example, sonst überhitzen sich unsere glaskugeln.</p>
<blockquote>
<p>In Projekt B trage ich irgendwo (Event) ein Objekt mit &quot;AddObserver&quot; ein und starte anschließend einen neuen Thread, in dem dann die Klasse C mit der statischen Liste erstellt wird.</p>
</blockquote>
<p>was bedeutet, du &quot;erstellst eine klasse&quot;? eine klasse kannst du in C++ nicht zur laufzeit &quot;erstellen&quot;. meinst du instanziieren? meinst du ...?</p>
<blockquote>
<p>Nachdem ich den Pointer eingetragen hab, ist die Größe der Liste mit Sicherheit 1.</p>
</blockquote>
<p>hast du das ausprobiert, bevor du den anderen thread startest? lass dir die listenlänge ausgeben, bevor du den thread startest und verifiziere. wenn da auch was nicht stimmt, hat es sicher nichts mit threads zu tun.</p>
<p>threadsicherheit ist allerdings ein kompliziertes kapitel und du läufst da dann vielleicht besser, wenn du nicht in diesem subforum nach hilfe suchst, weil ISO C++ keine threads kennt und ich persönlich mich z.b. mit den OS-möglichkeiten für multithreading unter windows schon seit jahren nicht mehr herumgeplagt habe.</p>
<p>wenn du deinen debugger nicht verwenden willst, dann lass deine klassen eben jeweils die debug-informationen ausgeben (AddObject wurde aufgerufen, list_size=..., usw.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306851</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Fri, 15 Jun 2007 19:17:41 GMT</pubDate></item><item><title><![CDATA[Reply to Statische Variable in Klasse on Mon, 18 Jun 2007 20:56:07 GMT]]></title><description><![CDATA[<p>Ich hab ja schon etliche male versucht, das Problem nachzustellen. Dabei bekomme ich aber nix hin, was <em>nicht</em> funktioniert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /><br />
Leider kann ich auch das Programm nicht weiter reduzieren, da hängt viel zu viel ineinander.</p>
<p>Dann skizziere ich erstmal die Klassen (2 relevante):</p>
<pre><code class="language-cpp">struct Observer
{};

class Alpha
{
    static std::vector&lt;Observer*&gt; aObservers;

    static void AddObserver( Observer* pObserver )
    {  aObservers.push_back(pObserver);  }

    void DoSomething()
    {  for (size_t i=0; i&lt;aObservers.size(); i++)  aObservers[i]-&gt;Notify();  }
};

class Beta : public Observer
{
    Beta()  { Alpha::AddObserver(this); }
    // this-Zeiger im Konstruktor sind umstritten, aber es geht ja darum, warum
    //   der vector dann leer ist.
};

// Event wird ausgelöst:

Beta b;
// Hier ist aObservers.size() == 1
CreateNewThread...  // Im Thread wird eine (genau eine) Instanz von Alpha erzeugt.
Beta.Work();   // Erzeugt im wesentlichen ein Fenster und fängt Nachrichten ab, sonst nix.
</code></pre>
<p>Ich versuche mal, das Ganze zeitlich zu skizzieren:<br />
- Event wird ausgelöst<br />
- Alpha::AddObserver wird aufgerufen<br />
- Geht in CreateNewThread rein (erstellt neuen Thread), wo eine Methode aus einem Python-Skript aufgerufen wird, die dann wieder über ein Interface eine unserer Methoden startet.<br />
- In dieser Methode wird eine Instanz von Alpha erzeugt.<br />
- Steuerung geht wieder an Python zurück...<br />
- ... und ruft wieder eine Methode von Alpha auf<br />
- und schwupps ist der vector leer...</p>
<p>Ok, ich glaub ich werd noch ein paar Stunden lang Status-Meldungen reinsetzen und studieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Und danke übrigens für deine Antwort!</p>
<p>Edit: Ich bin verzweifelt... Ich habs jetzt mit plumpen Messageboxen lokalisiert (von wegen stundenlange Status-Meldungen :D), der Fehler kommt hier:</p>
<pre><code class="language-cpp">Irgendeine Funktion:
...
// Hier ist die Größe des Vektors noch 1
DoSmltnStep( pPar-&gt;iStepCount );
...

DoSmltnStep:
// Hier, direkt nach Methodenaufruf, ist die Größe 0
</code></pre>
<p>Ich hab jetzt alles bereinigt und neu erstellt, keine Änderung. Kennt jemand sowas? Kann das ein Bug sein? Ich bin mir wirklich zu 99,9999% sicher, dass es zwischen diesen beiden Ausgaben &quot;passiert&quot;. Und nein, die Statusmeldung leert das Ding nicht, es gibt keine 2 Funktionen, die &quot;DoSmltnStep&quot; heißen usw.<br />
Ich... weiß nicht weiter <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>An den Threads kanns/solltes nicht liegen, der Haupthread macht 100% nix weiter mit Alpha. An Python kanns auch nicht liegen, an der Stelle ist es nicht im Spiel.</p>
<p>Falls es jemanden interessiert: Ich hab das Problem zwar nicht lösen, aber wenigstens identifizieren können.<br />
Ein Projekt wurde als DLL erstellt, eins als Exe (die die DLL direkt und unter Umwegen von Python benutzt). Beide haben die Klasse mit der statischen Variable genutzt und hatten aber je eine eigene Version der Variable.<br />
Sprich: Hat eine Funktion aus der DLL die statische Variable verändert, hat das aus der Sicht der Exe nichts verändert... Sauerei <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306908</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 18 Jun 2007 20:56:07 GMT</pubDate></item></channel></rss>