<?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[Multible Definition Problem in Multi-File Projekt]]></title><description><![CDATA[<p>Hi,<br />
die Frage ist eigentlich vollkommen blöd und mir fast etwas peinlich da ich jetzt schon ne Weile in C++ programmiere aber hier:</p>
<p>Ich habe eine Header-File in der ich 2 Globale Objekte definiert habe die ich in mehrer Sourcefiles benutzen möchte:</p>
<pre><code class="language-cpp">#ifndef __GLOBALOBJECTS_H__
#define __GLOBALOBJECTS_H__

#include &lt;vector&gt;
#include &lt;string&gt;

std::string         curProcName;
std::vector&lt;DWORD&gt;  procList;

#endif // __GLOBALOBJECTS_H__
</code></pre>
<p>Nun ja, dachte mir es wäre eine gute Idee das so in ein Headerfile zu packen und in meinen Sourcefiles zu includen. Pustekuchen:</p>
<blockquote>
<p>class std::vector&lt;unsigned long,class std::allocator&lt;unsigned long&gt; &gt; procList&quot; (?procList@@3V?<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>v</mi><mi>e</mi><mi>c</mi><mi>t</mi><mi>o</mi><mi>r</mi><mi mathvariant="normal">@</mi><mi>K</mi><mi>V</mi><mo>?</mo></mrow><annotation encoding="application/x-tex">vector@KV?</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.69444em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.03588em;">v</span><span class="mord mathit">e</span><span class="mord mathit">c</span><span class="mord mathit">t</span><span class="mord mathit">o</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathrm">@</span><span class="mord mathit" style="margin-right:0.07153em;">K</span><span class="mord mathit" style="margin-right:0.22222em;">V</span><span class="mclose">?</span></span></span></span>allocator@K@std@@@std@@A) ist bereits in NavigatormainFrame.obj definiert.</p>
</blockquote>
<p>Mein funktionierender Ansatz war es die Objekte in eine .cpp file zu stecken und Funktionen zu definieren die die Objekte zurückgeben, zb.</p>
<pre><code class="language-cpp">std::vector&lt;DWORD&gt; getProcList()
{
    return procList;
}
</code></pre>
<p>Aber naja, ich werde wohl noch deutlich mehr Objekte haben und für jedes Objekt eine Funktion zu schreiben scheint mir ein dreckiges Workaround zu sein.</p>
<p>Also, welchen groben Designfehler mache ich und wie gehts besser? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Danke !</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246829/multible-definition-problem-in-multi-file-projekt</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 20:50:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246829.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Aug 2009 14:18:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Multible Definition Problem in Multi-File Projekt on Sun, 02 Aug 2009 14:18:30 GMT]]></title><description><![CDATA[<p>Hi,<br />
die Frage ist eigentlich vollkommen blöd und mir fast etwas peinlich da ich jetzt schon ne Weile in C++ programmiere aber hier:</p>
<p>Ich habe eine Header-File in der ich 2 Globale Objekte definiert habe die ich in mehrer Sourcefiles benutzen möchte:</p>
<pre><code class="language-cpp">#ifndef __GLOBALOBJECTS_H__
#define __GLOBALOBJECTS_H__

#include &lt;vector&gt;
#include &lt;string&gt;

std::string         curProcName;
std::vector&lt;DWORD&gt;  procList;

#endif // __GLOBALOBJECTS_H__
</code></pre>
<p>Nun ja, dachte mir es wäre eine gute Idee das so in ein Headerfile zu packen und in meinen Sourcefiles zu includen. Pustekuchen:</p>
<blockquote>
<p>class std::vector&lt;unsigned long,class std::allocator&lt;unsigned long&gt; &gt; procList&quot; (?procList@@3V?<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>v</mi><mi>e</mi><mi>c</mi><mi>t</mi><mi>o</mi><mi>r</mi><mi mathvariant="normal">@</mi><mi>K</mi><mi>V</mi><mo>?</mo></mrow><annotation encoding="application/x-tex">vector@KV?</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.69444em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.03588em;">v</span><span class="mord mathit">e</span><span class="mord mathit">c</span><span class="mord mathit">t</span><span class="mord mathit">o</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathrm">@</span><span class="mord mathit" style="margin-right:0.07153em;">K</span><span class="mord mathit" style="margin-right:0.22222em;">V</span><span class="mclose">?</span></span></span></span>allocator@K@std@@@std@@A) ist bereits in NavigatormainFrame.obj definiert.</p>
</blockquote>
<p>Mein funktionierender Ansatz war es die Objekte in eine .cpp file zu stecken und Funktionen zu definieren die die Objekte zurückgeben, zb.</p>
<pre><code class="language-cpp">std::vector&lt;DWORD&gt; getProcList()
{
    return procList;
}
</code></pre>
<p>Aber naja, ich werde wohl noch deutlich mehr Objekte haben und für jedes Objekt eine Funktion zu schreiben scheint mir ein dreckiges Workaround zu sein.</p>
<p>Also, welchen groben Designfehler mache ich und wie gehts besser? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Danke !</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754001</guid><dc:creator><![CDATA[Icematix]]></dc:creator><pubDate>Sun, 02 Aug 2009 14:18:30 GMT</pubDate></item><item><title><![CDATA[Reply to Multible Definition Problem in Multi-File Projekt on Sun, 02 Aug 2009 14:30:20 GMT]]></title><description><![CDATA[<p>Icematix schrieb:</p>
<blockquote>
<p>Also, welchen groben Designfehler mache ich und wie gehts besser? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Du benutzt globale Variablen. Benutze keine globalen Variablen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ansonsten schreib ein <code>extern</code> dazu, schreib zum Header eine <code>*.cpp</code> und definiere dort die Variablen.</p>
<pre><code class="language-cpp">// Headerfile
extern int globalInteger;
extern std::vector&lt;int&gt; globalIntegerVector;
// usw.

// Sourcefile
#include &quot;globalheader.hpp&quot;

int globalInteger;
std::vector&lt;int&gt; globalIntegerVector;
</code></pre>
<p>Alle inkludieren nur die Deklaration und durch das extern weiss der Linker, dass die Variablen in einem Objectfile irgendwo definiert sind, sucht danach und findet sie dann in diesem einen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754009</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 02 Aug 2009 14:30:20 GMT</pubDate></item><item><title><![CDATA[Reply to Multible Definition Problem in Multi-File Projekt on Sun, 02 Aug 2009 14:57:51 GMT]]></title><description><![CDATA[<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<blockquote>
<p>Du benutzt globale Variablen. Benutze keine globalen Variablen.</p>
</blockquote>
<p>Warum denn nicht wenn ich Daten im ganzen Programm brauche ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754026</guid><dc:creator><![CDATA[Icematix]]></dc:creator><pubDate>Sun, 02 Aug 2009 14:57:51 GMT</pubDate></item><item><title><![CDATA[Reply to Multible Definition Problem in Multi-File Projekt on Sun, 02 Aug 2009 15:10:17 GMT]]></title><description><![CDATA[<p>Icematix schrieb:</p>
<blockquote>
<p>Warum denn nicht wenn ich Daten im ganzen Programm brauche ?</p>
</blockquote>
<p>Weil es für die Übersicht nicht förderlich ist. Man sollte Variablen als Funktionsargumente weitergeben, so weiss man immer, was woher kommt und wo verändert wurde. Du kannst Veränderungen deutlich einfacher nachvollziehen.</p>
<p>Ein einfaches Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int* g_integer;

void create();
void use();
void destroy();

int main()
{
  create(); // Was denn?

  use(); // Was?

  destroy(); // Was wird zerstört?

  use(); // BUMMM, wieso???
}

void create()
{
  g_integer = new int(3);
}

void use()
{
  std::cout &lt;&lt; *g_integer &lt;&lt; std::endl;
}

void destroy()
{
  delete g_integer;
  g_integer = 0;
}
</code></pre>
<p>Es ist ein einfaches Beispiel, hier könnte man noch mitkommen. Wenn aber alles über duzende von Files verteilt ist, dann hast du keine Ahnung mehr, was passiert. Die Funktionen verändern plötzlich Variablen und Einstellungen und es ist dir gar nicht klar. Wenn es dagegen so aufgebaut ist, dann ist es viel verständlicher.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int* create();
void use(int* v);
void destroy(int* v);

int main()
{
  int* p = create(); // Klar, wir haben nun einen Integer erstellt.

  use(p); // Klar, wir verwenden p, also den Integer.

  destroy(p); // Klar, wir zerstören p, also den Integer.

  use(p); // BUMM, logisch, p wurde ja zerstört.
}

// ich spare mir jetzt die Implementation der Funktionen. Es sollte klar sein,
// wie diese aussehen.
</code></pre>
<p>Meistens erfordert dies auch ein etwas anderes Design, als wenn man es über globale Variablen löst. Aber in den meistens Fällen kann man sie umgehen und es ist sehr zu empfehlen.<br />
Falls man trotzdem mal ein paar Daten global braucht und nur einmal angelegt haben möchte, gibt es noch die Singleton Möglichkeit. Wobei ich aber klar sagen möchte, dass sie kein Ersetzung von globalen Variablen darstellen und man sie auch nicht im Überfluss benutzen sollte.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754030</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 02 Aug 2009 15:10:17 GMT</pubDate></item></channel></rss>