<?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[Einige Fragen zu Klassen und istream]]></title><description><![CDATA[<p>Hallo,<br />
Ich habe gerade angefangen, mich mit Klassen zu beschäftigen.<br />
Meine Klasse sieht in etwa so aus:</p>
<pre><code class="language-cpp">class Klasse
{
   private:
    std::string a;
    std::string b;

   public:
    Klasse(const char* x, const char* y);
    friend std::istream&amp; operator &gt;&gt; (std::istream&amp; is, Klasse&amp; op);
    //diverse andere konstruktoren, operatorüberladungen und memberfunktionen

};
</code></pre>
<p><strong>Die erste Frage</strong> wäre: Wie muss hier der Destruktor aussehen?<br />
Reicht ein einfaches <strong>~Klasse() {}</strong> oder muss im Destruktor noch irgendetwas besonderes stehen?</p>
<p>Die <strong>zweite Frage</strong> ist, ob ich den char-Zeiger des Konstruktors löschen muss:</p>
<pre><code class="language-cpp">Klasse::Klasse(const char* x, const char* y)
: a(x), b(y)
{
  //hier char * x und y löschen?
}
</code></pre>
<p>Die <strong>dritte Frage</strong> wäre, wie ich &quot;if&quot; überladen kann, sodass <strong>if(objekt)</strong> funktioniert (den ! Operator habe ich schon überladen; if(!objekt) klappt also)</p>
<p>Die <strong>letzte Frage</strong> bezieht sich auf das Überladen des &gt;&gt; Operators. Im Moment habe ich das so gelöst:</p>
<pre><code class="language-cpp">std::istream&amp; operator &gt;&gt; (std::istream&amp; is, Klasse&amp; op)
{
    is &gt;&gt; op.a;
    is &gt;&gt; op.b;
    return is;
}
</code></pre>
<p>Das Problem dabei ist, dass string b aus mehreren Wörtern bestehen kann. Bei der Eingabe von zB &quot;StringA StringB1 StringB2&quot; wird natürlich nur StringB1 eingelesen. Als Lösung hatte ich mir überlegt, mit getline zu arbeiten. Da der &gt;&gt; operator aber sowohl mit cin als auch beim Einlesen von Daten aus Dateien funktionieren soll, weis ich nicht genau, wie ich das einrichten soll. Hat da irgendjemand eine Idee?</p>
<p>Schonmal Danke im Voraus! <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/236370/einige-fragen-zu-klassen-und-istream</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 00:57:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/236370.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 14 Mar 2009 02:45:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einige Fragen zu Klassen und istream on Sat, 14 Mar 2009 02:45:31 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Ich habe gerade angefangen, mich mit Klassen zu beschäftigen.<br />
Meine Klasse sieht in etwa so aus:</p>
<pre><code class="language-cpp">class Klasse
{
   private:
    std::string a;
    std::string b;

   public:
    Klasse(const char* x, const char* y);
    friend std::istream&amp; operator &gt;&gt; (std::istream&amp; is, Klasse&amp; op);
    //diverse andere konstruktoren, operatorüberladungen und memberfunktionen

};
</code></pre>
<p><strong>Die erste Frage</strong> wäre: Wie muss hier der Destruktor aussehen?<br />
Reicht ein einfaches <strong>~Klasse() {}</strong> oder muss im Destruktor noch irgendetwas besonderes stehen?</p>
<p>Die <strong>zweite Frage</strong> ist, ob ich den char-Zeiger des Konstruktors löschen muss:</p>
<pre><code class="language-cpp">Klasse::Klasse(const char* x, const char* y)
: a(x), b(y)
{
  //hier char * x und y löschen?
}
</code></pre>
<p>Die <strong>dritte Frage</strong> wäre, wie ich &quot;if&quot; überladen kann, sodass <strong>if(objekt)</strong> funktioniert (den ! Operator habe ich schon überladen; if(!objekt) klappt also)</p>
<p>Die <strong>letzte Frage</strong> bezieht sich auf das Überladen des &gt;&gt; Operators. Im Moment habe ich das so gelöst:</p>
<pre><code class="language-cpp">std::istream&amp; operator &gt;&gt; (std::istream&amp; is, Klasse&amp; op)
{
    is &gt;&gt; op.a;
    is &gt;&gt; op.b;
    return is;
}
</code></pre>
<p>Das Problem dabei ist, dass string b aus mehreren Wörtern bestehen kann. Bei der Eingabe von zB &quot;StringA StringB1 StringB2&quot; wird natürlich nur StringB1 eingelesen. Als Lösung hatte ich mir überlegt, mit getline zu arbeiten. Da der &gt;&gt; operator aber sowohl mit cin als auch beim Einlesen von Daten aus Dateien funktionieren soll, weis ich nicht genau, wie ich das einrichten soll. Hat da irgendjemand eine Idee?</p>
<p>Schonmal Danke im Voraus! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1679705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679705</guid><dc:creator><![CDATA[clasy]]></dc:creator><pubDate>Sat, 14 Mar 2009 02:45:31 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Klassen und istream on Sat, 14 Mar 2009 10:47:21 GMT]]></title><description><![CDATA[<p>clasy schrieb:</p>
<blockquote>
<p>Wie muss hier der Destruktor aussehen?<br />
Reicht ein einfaches <strong>~Klasse() {}</strong> oder muss im Destruktor noch irgendetwas besonderes stehen?</p>
</blockquote>
<p>Im Destruktor muss per Definition nix stehen. Wenn du z.B. Speicher alloziert hast (z.B. im Konstruktor), dann kannst (und solltest) du ihn im Destruktor wieder freigeben.</p>
<p>clasy schrieb:</p>
<blockquote>
<p>Die <strong>zweite Frage</strong> ist, ob ich den char-Zeiger des Konstruktors löschen muss:</p>
<pre><code class="language-cpp">Klasse::Klasse(const char* x, const char* y)
: a(x), b(y)
{
  //hier char * x und y löschen?
}
</code></pre>
</blockquote>
<p>Den Zeiger &quot;löschen&quot; geht ja nicht. Das ist einfach eine lokale Variable, die mit dem Ende der Funktion (hier Konstruktor) ihre Gültigkeit verliert. Wenn du aber meinst, ob du den Speicherbereich, auf den der Zeiger zeigt, freigeben sollst: keine Ahnung! <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="😉"
    /> Ich weiß ja nicht, woher x und y kommen. Normalerweise würde ich aber sagen, dass der Speicherbereich unbedingt an der Stelle freigegeben werden sollte, an der er auch angefordert wurde. Da das nicht in deiner Klasse passiert, sollte deine Klasse auch nix freigeben. Aber mal eine andere Frage: woher kommen denn diese Zeiger? Und sind die noch gültig, während deine Klasse Bestand hat? Wenn du irgendwelche (nicht-globale) Strings übergeben willst, dann sollte deine Klasse sich vielleicht besser eine Kopie davon machen. Denn wenn du nur die Zeiger speicherst und der Bereich, auf den gezeigt wird, nicht mehr gültig ist, dann hast du ein Problem.</p>
<p>clasy schrieb:</p>
<blockquote>
<p>Die <strong>dritte Frage</strong> wäre, wie ich &quot;if&quot; überladen kann</p>
</blockquote>
<p>Imho nicht. if ist keine Funktion und kein Operator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1679779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679779</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Sat, 14 Mar 2009 10:47:21 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Klassen und istream on Sat, 14 Mar 2009 10:52:25 GMT]]></title><description><![CDATA[<p>clasy schrieb:</p>
<blockquote>
<p>Die <strong>dritte Frage</strong> wäre, wie ich &quot;if&quot; überladen kann, sodass <strong>if(objekt)</strong> funktioniert (den ! Operator habe ich schon überladen; if(!objekt) klappt also)</p>
</blockquote>
<p>Dafür musst du nicht <code>if</code> überladen, sondern in der Klasse einen Cast-Operator zu einem als <code>bool</code> interpretierbaren Typen bereitstellen.</p>
<pre><code class="language-cpp">class Klasse
{
    public:
        operator bool () const;           // naheliegendste Möglichkeit
        operator void* () const;          // sicherer, siehe Safe Bool Idiom

        explicit operator bool () const;  // beste Variante, aber erst in C++09 möglich
};
</code></pre>
<p>Dafür solltest du den <code>operator!</code> nicht überladen, der ist nämlich nicht mehr nötig, wenn du einen <code>bool</code> hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1679781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679781</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 14 Mar 2009 10:52:25 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Klassen und istream on Sat, 14 Mar 2009 12:10:41 GMT]]></title><description><![CDATA[<p>Danke schonmal für die antworten!</p>
<p>Der Konstruktor</p>
<pre><code class="language-cpp">Klasse::Klasse(const char* x, const char* y)
: a(x), b(y)
{
  //hier char * x und y löschen?
}
</code></pre>
<p>soll bewirken, dass im programm dann</p>
<pre><code class="language-cpp">Klasse Objekt(&quot;stringA&quot;, &quot;stringB&quot;);
</code></pre>
<p>funktioniert. Die c-strings sind somit nur nötig, um &quot;stringA&quot; und &quot;stringB&quot; in die eigenschaften (also die std::strings) der Klasse umzuwandeln und werden nicht weiter benötigt.<br />
Muss ich den konstruktor jetzt um ein</p>
<pre><code class="language-cpp">delete [] x;
delete [] y;
</code></pre>
<p>erweitern, oder wird der von den c-strings angeforderte Speicherplatz beim verlassen des Konstruktors eh freigegeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1679813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679813</guid><dc:creator><![CDATA[clasy]]></dc:creator><pubDate>Sat, 14 Mar 2009 12:10:41 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Klassen und istream on Sat, 14 Mar 2009 12:13:39 GMT]]></title><description><![CDATA[<p>Nein, du darfst Stringliterale nicht löschen. Diese werden automatisch beim Beenden des Programms freigegeben.</p>
<p>Falls der Aufrufer aber <code>char</code> -Arrays dynamisch anfordert, ist er auch selber für deren Freigabe verantwortlich. Das ist nicht mehr Aufgabe des Konstruktors.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1679817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679817</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 14 Mar 2009 12:13:39 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Klassen und istream on Sat, 14 Mar 2009 12:14:21 GMT]]></title><description><![CDATA[<p>Der wird selbst verwaltet. Da musst du dir keine Sorgem machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1679818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679818</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 14 Mar 2009 12:14:21 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Klassen und istream on Sat, 14 Mar 2009 12:55:34 GMT]]></title><description><![CDATA[<p>Jetzt wurden alle Probleme gelöst, bis auf das letzte <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>Falls noch nicht klar wurde, was ich gemeint habe, noch mal ein anderes Beispiel:<br />
Meine Klasse hat zwei Eigenschaften: std::string a und std::string b.<br />
string a nimmt nur ein einzelnes Wort (eine ID) auf, während string b einen Namen aufnehmen soll, der durchaus aus mehreren wörtern bestehen kann.<br />
Die Datei, aus der ich Auslesen will, sieht ungefähr so aus:</p>
<pre><code>SADJ Name des ersten Objekts
AS Name des zweiten Objekts
</code></pre>
<p>wenn ich ein Objekt über den &gt;&gt; Operator einlesen will, soll string a=&quot;SADJ&quot; und string b=&quot;Name des ertes Objekts&quot; sein. Im Moment habe ich das folgendermaßen gelöst:</p>
<pre><code class="language-cpp">std::istream&amp; operator &gt;&gt; (std::istream&amp; is, Klasse&amp; op)
{
    is &gt;&gt; op.a;
    is &gt;&gt; op.b;
    return is;
}
</code></pre>
<p>Der Vorteil davon ist, dass ich so sowohl mit dem Einlesen aus Dateien arbeiten kann, als auch mit Eingaben vom Benutzer über std::cin. Der Nachteil dabei ist natürlich, dass string b immer nur &quot;Name&quot; sein wird, da das Einlesen des strings ja beim Leerzeichen unterbrochen wird.<br />
Die Einzige Lösung, die ich sehe, wäre mit getline zu arbeiten. Ich weis allerdings nicht, wie ich getline so benutzte, dass es sowhol für das Einleisen aus Dateien ALS AUCH für die Benutzeringaben über cin gültig ist.</p>
<pre><code class="language-cpp">string str;

cout &lt;&lt; &quot;Name des Objekts: &quot;;
getline (cin,str); //ganze Zeile über cin einlesen

ifstream lesen;
string dateiname=&quot;test.txt&quot;;
lesen.open(dateiname.c_str(), ios_base::in);
getline(lesen, str); //ganze Zeile aus Datei einlesen
</code></pre>
<p>Hat jemand eine Idee, wie ich den &gt;&gt; Operator so überlade, dass er eine ganze Zeile sowohl aus einer Datei als auch über cin einliest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1679836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679836</guid><dc:creator><![CDATA[clasy]]></dc:creator><pubDate>Sat, 14 Mar 2009 12:55:34 GMT</pubDate></item><item><title><![CDATA[Reply to Einige Fragen zu Klassen und istream on Sat, 14 Mar 2009 13:56:12 GMT]]></title><description><![CDATA[<p>Hat sich erledigt, lösung war einfach</p>
<pre><code class="language-cpp">std::istream&amp; operator &gt;&gt; (std::istream&amp; is, Klasse&amp; op)
{
    std::string tmp;
    getline(is, tmp);
    return is;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1679866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679866</guid><dc:creator><![CDATA[clasy]]></dc:creator><pubDate>Sat, 14 Mar 2009 13:56:12 GMT</pubDate></item></channel></rss>