<?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[Gutes Klassendesign (und warum Zeiger im Konstruktor?)]]></title><description><![CDATA[<p>Hallo liebe Community,</p>
<p>ich lerne momentan C++ mit dem Buch &quot;C++ lernen und professionell anwenden&quot;. Zuvor hatte ich schon mal etwas Java mit der Java Insel gelernt, jetzt verwirren mich ein paar Sachen beim Thema Klassen.</p>
<p>z . B. wird hier (s. 286) der Konstruktor der Klasse Konto definiert</p>
<pre><code class="language-cpp">Konto::Konto(const string&amp; k_name, unsigned long k_nr, double k_stand)
{
    nr = k_nr;
    name = k_name;
    stand = k_stand;
}
</code></pre>
<p>1. In dem Buch werden sehr oft im Konstruktor-Parameter Zeiger benutzt. Das kenne ich so aus Java nicht. Da ich noch nicht so bewandert mit Zeigern bin, frage ich mich ob das zum &quot;guten Klassendesign&quot; gehört und ob man das generell so macht - und was das überhaupt bringen soll...</p>
<p>2. In Java habe ich ich mir immer für die Zuweisung der privaten Variablen (in dem Fall hier nr, name, stand) Setter-Methoden geschrieben welche ich auch im Konstruktor benutzt habe. Das sehe ich hier in dem C++ Buch nicht.</p>
<p>Also z. b</p>
<pre><code class="language-cpp">setName(k_name);
</code></pre>
<p>Macht man das in C++ normalerweise auch so?<br />
___________________________________________________</p>
<p>In dem Programmbeispiel habe ich z. B. einen Getter gefunden:</p>
<pre><code class="language-cpp">class Konto {

private:
       string name;
       unsigned long nr;
       double stand;

public:
       Konto (const string&amp;, unsigned long, double);
       Konto (const string&amp; );
       bool init (const string&amp;, unsigned long, double);
       void display();
};
</code></pre>
<p>void display() (zeigt die Infos von name, stand und nr an )... In Java hätte ich die Methode in jedem Falle so genannt, dass ersichtlich ist das es sich um einen Getter handelt. Also z. B.</p>
<pre><code class="language-cpp">void getInfos();
</code></pre>
<p>______________________________________________________________</p>
<p>In den beiden Progammbeispielen ist die Klasse selbst in einer Headerdatei (konto.h) definiert, die Konstruktoren in einer Quelldatei (konto.cpp).</p>
<p>Macht man das in C++ so - und wenn ja: Warum? In Java habe ich das alles in eine Datei geschrieben... Wäre doch auch übersichtlicher?<br />
Muss ich in der konto.cpp die Headerdatei konto.h inkludieren? Oder weiß der Compiler das schon weil ich die Header-Datei so nenne wie die Klasse selbst?<br />
_______________________________________________________________</p>
<p>Kann mir jemand sagen ob es in C++ quasi eine Standard-Konvention für Klassendesigns gibt? Also wie so ein Klassendesign generell auszusehen hat?</p>
<p>Ich bedanke mich.</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301712/gutes-klassendesign-und-warum-zeiger-im-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 18:05:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301712.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 Apr 2012 08:05:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gutes Klassendesign (und warum Zeiger im Konstruktor?) on Mon, 02 Apr 2012 08:17:39 GMT]]></title><description><![CDATA[<p>Hallo liebe Community,</p>
<p>ich lerne momentan C++ mit dem Buch &quot;C++ lernen und professionell anwenden&quot;. Zuvor hatte ich schon mal etwas Java mit der Java Insel gelernt, jetzt verwirren mich ein paar Sachen beim Thema Klassen.</p>
<p>z . B. wird hier (s. 286) der Konstruktor der Klasse Konto definiert</p>
<pre><code class="language-cpp">Konto::Konto(const string&amp; k_name, unsigned long k_nr, double k_stand)
{
    nr = k_nr;
    name = k_name;
    stand = k_stand;
}
</code></pre>
<p>1. In dem Buch werden sehr oft im Konstruktor-Parameter Zeiger benutzt. Das kenne ich so aus Java nicht. Da ich noch nicht so bewandert mit Zeigern bin, frage ich mich ob das zum &quot;guten Klassendesign&quot; gehört und ob man das generell so macht - und was das überhaupt bringen soll...</p>
<p>2. In Java habe ich ich mir immer für die Zuweisung der privaten Variablen (in dem Fall hier nr, name, stand) Setter-Methoden geschrieben welche ich auch im Konstruktor benutzt habe. Das sehe ich hier in dem C++ Buch nicht.</p>
<p>Also z. b</p>
<pre><code class="language-cpp">setName(k_name);
</code></pre>
<p>Macht man das in C++ normalerweise auch so?<br />
___________________________________________________</p>
<p>In dem Programmbeispiel habe ich z. B. einen Getter gefunden:</p>
<pre><code class="language-cpp">class Konto {

private:
       string name;
       unsigned long nr;
       double stand;

public:
       Konto (const string&amp;, unsigned long, double);
       Konto (const string&amp; );
       bool init (const string&amp;, unsigned long, double);
       void display();
};
</code></pre>
<p>void display() (zeigt die Infos von name, stand und nr an )... In Java hätte ich die Methode in jedem Falle so genannt, dass ersichtlich ist das es sich um einen Getter handelt. Also z. B.</p>
<pre><code class="language-cpp">void getInfos();
</code></pre>
<p>______________________________________________________________</p>
<p>In den beiden Progammbeispielen ist die Klasse selbst in einer Headerdatei (konto.h) definiert, die Konstruktoren in einer Quelldatei (konto.cpp).</p>
<p>Macht man das in C++ so - und wenn ja: Warum? In Java habe ich das alles in eine Datei geschrieben... Wäre doch auch übersichtlicher?<br />
Muss ich in der konto.cpp die Headerdatei konto.h inkludieren? Oder weiß der Compiler das schon weil ich die Header-Datei so nenne wie die Klasse selbst?<br />
_______________________________________________________________</p>
<p>Kann mir jemand sagen ob es in C++ quasi eine Standard-Konvention für Klassendesigns gibt? Also wie so ein Klassendesign generell auszusehen hat?</p>
<p>Ich bedanke mich.</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197848</guid><dc:creator><![CDATA[swapswap]]></dc:creator><pubDate>Mon, 02 Apr 2012 08:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to Gutes Klassendesign (und warum Zeiger im Konstruktor?) on Mon, 02 Apr 2012 08:34:35 GMT]]></title><description><![CDATA[<p>Ich weiß jetzt nicht, wo Du da Zeiger siehst. Aber ich denke mal, Du wunderst dich gerade, warum da &quot;const string&amp;&quot; und nicht einfach &quot;string&quot; steht. Wenn du</p>
<pre><code class="language-cpp">void foo(string lokale_kopie)
{
  lokale_kopie += &quot;dings&quot;;
}
</code></pre>
<p>schreibst, ist der Parameter eine lokale und veränderbare Kopie. Manchmal ist das Kopieren von Objekten teuer. Wenn Du also nur lesend auf etwas zugreifen willst, kannst Du das mit dem Kopieren unterbinden:</p>
<pre><code class="language-cpp">void foo(string const&amp; string_referenz) // oder auch const string&amp;
{
  cout &lt;&lt; string_referenz &lt;&lt; endl;
}
</code></pre>
<p>Am Aufruf ändert sich dabei nichts. In Deinem Buch mal einfach zum Thema Referenzen nachgucken.</p>
<p>Seit letztem Jahr (C++2011) haben wir im Wesentlichen diese zwei Möglichkeiten, wenn es um einen nicht-trivialen Typen wie std::string geht:</p>
<pre><code class="language-cpp">class Person
{
  string name;
public:
  explicit Person(string n) // n ist eine lokale Kopie
  : name(move(n))           // aber eine Kopie brauchen wir sowieso
  {}                        // wir lassen sie in das Person-Objekt &quot;umziehen&quot;
};
</code></pre>
<p>Code, der typisch für C++2003 ist:</p>
<pre><code class="language-cpp">class Person
{
  string name;
public:
  explicit Person(string const&amp; n) // n ist eine Referenz
  : name(n)                        // hier wird kopiert
  {}
};
</code></pre>
<p>Nachteil: für n wird ggf ein temporäres string-Objekt als Ergebnis einer Konvertierung erzeugt, welches dann nochmal unnötigerweise kopiert wird.</p>
<p>Weniger schlau ist:</p>
<pre><code class="language-cpp">class Person
{
  string name;
public:
  explicit Person(string n)
  : name(n)
  {}
};
</code></pre>
<p>da hier <code>n</code> eine lokale Kopie ist, die dann nochmal nach <code>name</code> kopiert wird, obwohl n dann nicht mehr benötigt wird und sich wenig später wieder in Luft auflöst. Ohne C++2011, also ohne move, könntest Du das noch so optimieren:</p>
<pre><code class="language-cpp">class Person
{
  string name;
public:
  explicit Person(string n)
  { name.swap(n); }
};
</code></pre>
<p>da sich string-Werte i.d.R. sehr schnell (in konstanter Zeit) austauschen lassen.</p>
<p>Also: Ein bissel aufpassen, dass Du nicht zu viele unnötige Kopien erzeugst. Bei einer nicht-trivialen Klasse wird sonst ein beliebig komplexer Kopierkonstruktor aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197856</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 02 Apr 2012 08:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to Gutes Klassendesign (und warum Zeiger im Konstruktor?) on Mon, 02 Apr 2012 08:26:48 GMT]]></title><description><![CDATA[<p>Die Funktionsweise leuchtet ein. Danke dafür <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> !</p>
<p>Jemand noch Tipps bezüglich der anderen Fragen?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197859</guid><dc:creator><![CDATA[swapswap]]></dc:creator><pubDate>Mon, 02 Apr 2012 08:26:48 GMT</pubDate></item><item><title><![CDATA[Reply to Gutes Klassendesign (und warum Zeiger im Konstruktor?) on Mon, 02 Apr 2012 08:26:07 GMT]]></title><description><![CDATA[<p>Im Konstruktor auch besser eine Initialisierungsliste verwenden:</p>
<pre><code class="language-cpp">Konto::Konto(const string&amp; k_name, unsigned long k_nr, double k_stand)
{
    nr = k_nr;
    name = k_name;
    stand = k_stand;
}
</code></pre>
<p>-&gt;</p>
<pre><code class="language-cpp">Konto::Konto(const string&amp; k_name, unsigned long k_nr, double k_stand)
: nr(k_nr), name(k_name), stand(k_stand)
{}

Konto::Konto()
: nr(0), stand(0)
{}
</code></pre>
<p><a href="http://forums.codeguru.com/showthread.php?t=464084" rel="nofollow">http://forums.codeguru.com/showthread.php?t=464084</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197860</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 02 Apr 2012 08:26:07 GMT</pubDate></item><item><title><![CDATA[Reply to Gutes Klassendesign (und warum Zeiger im Konstruktor?) on Mon, 02 Apr 2012 08:30:08 GMT]]></title><description><![CDATA[<p>Hier Initialisierst du etwas:</p>
<pre><code class="language-cpp">setName(k_name);
</code></pre>
<p>es ist das Gleiche wie:</p>
<pre><code class="language-cpp">std::string k_name = &quot;lol&quot;;
</code></pre>
<p>Wen du erst im Konstruktor die Variablen definierst ist es so:</p>
<pre><code class="language-cpp">Whatever::Whatever(std::string&amp; k_name)
    {
        name = k_name;
    }
</code></pre>
<p>es ist das Gleiche wie:</p>
<pre><code class="language-cpp">std::string name;
    name = &quot;lol&quot;;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2197862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197862</guid><dc:creator><![CDATA[Jan++ 0]]></dc:creator><pubDate>Mon, 02 Apr 2012 08:30:08 GMT</pubDate></item><item><title><![CDATA[Reply to Gutes Klassendesign (und warum Zeiger im Konstruktor?) on Mon, 02 Apr 2012 08:30:39 GMT]]></title><description><![CDATA[<p>swapswap schrieb:</p>
<blockquote>
<p>In dem Programmbeispiel habe ich z. B. einen Getter gefunden:</p>
<pre><code class="language-cpp">class Konto {

private:
       string name;
       unsigned long nr;
       double stand;

public:
       Konto (const string&amp;, unsigned long, double);
       Konto (const string&amp; );
       bool init (const string&amp;, unsigned long, double);
       void display();
};
</code></pre>
<p>void display() (zeigt die Infos von name, stand und nr an )... In Java hätte ich die Methode in jedem Falle so genannt, dass ersichtlich ist das es sich um einen Getter handelt. Also z. B.</p>
<pre><code class="language-cpp">void getInfos();
</code></pre>
</blockquote>
<p>Wie kann eine Funktion die mit void beginnt und mit () aufhört ein getter sein?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197863</guid><dc:creator><![CDATA[Tippgeber]]></dc:creator><pubDate>Mon, 02 Apr 2012 08:30:39 GMT</pubDate></item><item><title><![CDATA[Reply to Gutes Klassendesign (und warum Zeiger im Konstruktor?) on Mon, 02 Apr 2012 08:36:36 GMT]]></title><description><![CDATA[<p>Danke für die vielen Antworten, das hilft mir wirklich extrem weiter.</p>
<p>Tippgeber schrieb:</p>
<blockquote>
<p>Wie kann eine Funktion die mit void beginnt und mit () aufhört ein getter sein?!</p>
</blockquote>
<p>Danke ! Logikfehler meinerseits. Ich mach ja nichts mehr mit den Daten <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="😃"
    /> ...<br />
Schon etwas her als ich das mal in Java gelernt hatte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197865</guid><dc:creator><![CDATA[swapswap]]></dc:creator><pubDate>Mon, 02 Apr 2012 08:36:36 GMT</pubDate></item></channel></rss>