<?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[Klassen-Organisationsproblem]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>langsam machts mich wahnsinng, also folgende Struktur:</p>
<p>main.cpp:</p>
<pre><code class="language-cpp">#include &quot;CKlasse1.h&quot;
#include &quot;CKlasse2.h&quot;

CKlasse1 Klasse1;
CKlasse2 Klasse2;

int main()
{
    Klasse1.SagHallo();
    Klasse2.Wiederhole();
    return 0;
}
</code></pre>
<p>CKlasse1.h:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class CKlasse1
{
    public:
    void SagHallo(void);
};
</code></pre>
<p>CKlasse1.cpp:</p>
<pre><code class="language-cpp">#include &quot;CKlasse1.h&quot;

void CKlasse1::SagHallo(void)
{
    std::cout &lt;&lt; &quot;Hallo!\n&quot;;
    return;
}
</code></pre>
<p>CKlasse2.h:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

extern CKlasse1 Klasse1;

class CKlasse2
{
    public:
    void Wiederhole(void);
};
</code></pre>
<p>CKlasse2.cpp:</p>
<pre><code class="language-cpp">#include &quot;CKlasse2.h&quot;

void CKlasse2::Wiederhole(void)
{
    Klasse1.SagHallo();
    return;
}
</code></pre>
<p>So, jetzt heißt es in CKlasse2.h immer<br />
<strong>error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'Klasse1'</strong></p>
<p>Hilfe...</p>
<p>lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/205475/klassen-organisationsproblem</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 02:20:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/205475.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Feb 2008 16:49:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassen-Organisationsproblem on Thu, 14 Feb 2008 16:49:21 GMT]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>langsam machts mich wahnsinng, also folgende Struktur:</p>
<p>main.cpp:</p>
<pre><code class="language-cpp">#include &quot;CKlasse1.h&quot;
#include &quot;CKlasse2.h&quot;

CKlasse1 Klasse1;
CKlasse2 Klasse2;

int main()
{
    Klasse1.SagHallo();
    Klasse2.Wiederhole();
    return 0;
}
</code></pre>
<p>CKlasse1.h:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class CKlasse1
{
    public:
    void SagHallo(void);
};
</code></pre>
<p>CKlasse1.cpp:</p>
<pre><code class="language-cpp">#include &quot;CKlasse1.h&quot;

void CKlasse1::SagHallo(void)
{
    std::cout &lt;&lt; &quot;Hallo!\n&quot;;
    return;
}
</code></pre>
<p>CKlasse2.h:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

extern CKlasse1 Klasse1;

class CKlasse2
{
    public:
    void Wiederhole(void);
};
</code></pre>
<p>CKlasse2.cpp:</p>
<pre><code class="language-cpp">#include &quot;CKlasse2.h&quot;

void CKlasse2::Wiederhole(void)
{
    Klasse1.SagHallo();
    return;
}
</code></pre>
<p>So, jetzt heißt es in CKlasse2.h immer<br />
<strong>error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'Klasse1'</strong></p>
<p>Hilfe...</p>
<p>lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455989</guid><dc:creator><![CDATA[MaDsTyLe]]></dc:creator><pubDate>Thu, 14 Feb 2008 16:49:21 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Organisationsproblem on Thu, 14 Feb 2008 16:58:58 GMT]]></title><description><![CDATA[<p>also was mir bis jetzt aufgefallen ist, eine methode die void ist, kann nix zurückgeben, und nimm auch mal das void als übergabeparameter raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455995</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Thu, 14 Feb 2008 16:58:58 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Organisationsproblem on Thu, 14 Feb 2008 17:02:51 GMT]]></title><description><![CDATA[<p>In CKlasse2.cpp ist Klasse1 nicht bekannt (CKlasse1.h nicht inkludiert). Deswegen kennt der Compiler da auch dessen Memberfunktion nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456000</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 14 Feb 2008 17:02:51 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Organisationsproblem on Thu, 14 Feb 2008 17:03:38 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15364">@Firefighter</a>:</p>
<p>Hey, danke für die schnelle Antwort!</p>
<p>Ich hab beides gemacht, aber leider ändert sich dadurch nichts...</p>
<p>lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456001</guid><dc:creator><![CDATA[MaDsTyLe]]></dc:creator><pubDate>Thu, 14 Feb 2008 17:03:38 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Organisationsproblem on Thu, 14 Feb 2008 17:05:45 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1387">@Braunstein</a>:</p>
<p>Hmmm, das funktioniert ja sogar...^^</p>
<p>Danke!</p>
<p>lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456010</guid><dc:creator><![CDATA[MaDsTyLe]]></dc:creator><pubDate>Thu, 14 Feb 2008 17:05:45 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Organisationsproblem on Thu, 14 Feb 2008 17:31:46 GMT]]></title><description><![CDATA[<p>MaDsTyLe schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Dennoch fehlen mir Anmerkungen zu deinen Code:<br />
* Globale Variablen sollte man vermeiden<br />
* Includes nur an Stellen wo man sie braucht<br />
* return; in einer void-Funktion/Methode als letzte Anweisung ist unnötig<br />
* int main() macht am Schluß (Ausnahme von der Regel) ein implizites return 0, so das du dir das Sparen kannst.<br />
* Ungarische Notation und ähnliches (z.B. C vor Klassennamen) ist in C++ spätestens seit der Einführung von Templates weitgehend aus der Mode geraten. Zumal man dabei in Namenskonflikte mit Bibliotheken wie der MFC oder ähnlichen kommen kann (hier würden aber Namensräume weiterhelfen).<br />
* (void) ist eigendlich unnötig, () sagt imho mehr aus. Dies ist aber nun wirklich Geschmackssache ;p</p>
<p>(auf Includeguards etc. habe ich hier der Übersicht halber verzichtet)<br />
// Änderung an main.cpp:</p>
<pre><code class="language-cpp">#include &quot;CKlasse1.h&quot;
#include &quot;CKlasse2.h&quot;

int main()
{
    CKlasse1 Klasse1;
    CKlasse2 Klasse2(Klasse1);
    Klasse1.SagHallo();
    Klasse2.Wiederhole();
}
</code></pre>
<p>// Änderung CKlasse2.h:</p>
<pre><code class="language-cpp">class CKlasse1;

class CKlasse2
{
    private:
      CKlasse1&amp; klasse1;
    public:
      CKlasse2(CKlasse1&amp; klasse1);
      void Wiederhole();
};
</code></pre>
<p>// Änderung CKlasse2.cpp:</p>
<pre><code class="language-cpp">#include &quot;CKlasse1.h&quot;
#include &quot;CKlasse2.h&quot;

CKlasse2::CKlasse2(CKlasse1&amp; klasse1)
: klasse1(klasse1)
{
}

void CKlasse2::Wiederhole()
{
    klasse1.SagHallo();
}
</code></pre>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456028</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 14 Feb 2008 17:31:46 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Organisationsproblem on Thu, 14 Feb 2008 19:19:50 GMT]]></title><description><![CDATA[<p>Hmm danke, ich versteh zwar nich wieso ich globale Variablen vermeiden sollte, aber ansonsten werd ich mich bemühen Deinen Ratschlägen folge zu leisten.</p>
<p>Wenn ich zB die hInstance von WinMain in eine globale Variable kopiere, kann ich sie in allen weiteren Codesegmenten sofort aufrufen und muss sie nicht immer als Parameter mitliefern. Es hilft mir schlicht und ich seh nicht, wo das Probleme bereitet.</p>
<p>Egal, ich hab da noch eine Frage bezüglich der Includes.</p>
<p>Wenn ich jetzt in meiner main.cpp eine global.h include, dann komm ich logischerweise aus der CKlasse2.cpp da nicht ran. Wenn ich sie da nun aber ebenfalls includiere, bekomm ich korrekterweise den Linker-Error, dass die Prozeduren nun doppelt sind.</p>
<p>Wie komm ich aber trotzdem in der CKlasse2.cpp an meine global.h-Funktionen?</p>
<p>lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456086</guid><dc:creator><![CDATA[MaDsTyLe]]></dc:creator><pubDate>Thu, 14 Feb 2008 19:19:50 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Organisationsproblem on Thu, 14 Feb 2008 20:26:52 GMT]]></title><description><![CDATA[<p>MaDsTyLe schrieb:</p>
<blockquote>
<p>Wenn ich jetzt in meiner main.cpp eine global.h include, dann komm ich logischerweise aus der CKlasse2.cpp da nicht ran. Wenn ich sie da nun aber ebenfalls includiere, bekomm ich korrekterweise den Linker-Error, dass die Prozeduren nun doppelt sind.</p>
</blockquote>
<p>Sauber Trennung Header und Source vorausgesetzt, wird es wohl an fehlenden Includeguards liegen...</p>
<pre><code class="language-cpp">#if !defined(EINDEUTIGERNAME_HEADER)
#define EINDEUTIGERNAME_HEADER
// &lt;-- Hier der eigentliche Includeinhalt
#endif
</code></pre>
<p>MaDsTyLe schrieb:</p>
<blockquote>
<p>Hmm danke, ich versteh zwar nich wieso ich globale Variablen vermeiden sollte, aber ansonsten werd ich mich bemühen Deinen Ratschlägen folge zu leisten.</p>
<p>Wenn ich zB die hInstance von WinMain in eine globale Variable kopiere, kann ich sie in allen weiteren Codesegmenten sofort aufrufen und muss sie nicht immer als Parameter mitliefern. Es hilft mir schlicht und ich seh nicht, wo das Probleme bereitet.</p>
</blockquote>
<p>1. Ist die Reihenfolge der initialisierung globaler Variablen nicht definiert (Spätestens mit Abhängigkeiten untereinander kannst du dort leicht auf Fehler stoßen die schwer zu finden sind).</p>
<p>2. Globale Variablen machen dein Programm schwerer zu lesen, wer worauf zugreift ist schwer zu kontrollieren.<br />
Ein Merkmal von sauberer Programmierung ist, das Eingangs- und Ausgangsgrößen klar erkennbar sind (Bei Funktionen über den Rückgabewert und die Parameterliste, bei Klassen über die Schnittstelle (sprich: öffentliche Methoden - öffentliche Methoden wiederum sind in der Regel ein Zeichen schlechter OO-Programmierung).</p>
<p>siehe auch: <a href="http://fara.cs.uni-potsdam.de/~kaufmann//faqs/Global.pdf" rel="nofollow">http://fara.cs.uni-potsdam.de/~kaufmann//faqs/Global.pdf</a></p>
<p>Ich rezitiere mal: &quot;So lokal wie möglich, so global wie nötig&quot;</p>
<p>Ja, es gibt Ausnahmen in denen sie Sinn machen können, wobei es auch hier noch Alternativen gibt die zumindestens ein wenig besser sind. Aber dies sollte immer die absolute Ausnahme, nicht die Regel darstellen.</p>
<p>Wenn du schon etwas &quot;global&quot; brauchst, kannst du wenigstens für eine definierte Initialisierungsreihenfolge sorgen:</p>
<pre><code class="language-cpp">static Application&amp; GetApplication()
{
  static Application applic;
  return applic;
}
</code></pre>
<p>Damit ist zumindestens Sichergestellt das dieses Objekt erst mit dem ersten Aufruf initialisiert wird. Auch diese Variante beachtet nicht das Open-Closed-Prinzip, ist aber zumindest einen kleinen Tick besser als globale Objekte.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456153</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 14 Feb 2008 20:26:52 GMT</pubDate></item></channel></rss>