<?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[operator &amp;lt;&amp;lt; überladen]]></title><description><![CDATA[<p>Hallo,<br />
Ich habe den operator&lt;&lt; überladen:</p>
<pre><code class="language-cpp">class Exception {
	const Exception&amp; operator&lt;&lt; (std::string val) {
		Parameter.push_back(val);
		return(*this);
	}
};
</code></pre>
<p>Jetzt habe ich folgende Zeile:</p>
<pre><code class="language-cpp">throw Exception(ExceptionType::IndexOutOfRange) &lt;&lt; index &lt;&lt; val
</code></pre>
<p>Wirft diese Zeile eine Exception(ExceptionType::IndexOutOfRange), in die index und val eingefügt wurden? Oder verstehe ich etwas daran falsch?</p>
<p>Danke schon im Voraus.</p>
<p>mfg<br />
Mr X</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/257596/operator-lt-lt-überladen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 07:40:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/257596.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Dec 2009 20:33:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator &amp;lt;&amp;lt; überladen on Wed, 30 Dec 2009 20:33:57 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Ich habe den operator&lt;&lt; überladen:</p>
<pre><code class="language-cpp">class Exception {
	const Exception&amp; operator&lt;&lt; (std::string val) {
		Parameter.push_back(val);
		return(*this);
	}
};
</code></pre>
<p>Jetzt habe ich folgende Zeile:</p>
<pre><code class="language-cpp">throw Exception(ExceptionType::IndexOutOfRange) &lt;&lt; index &lt;&lt; val
</code></pre>
<p>Wirft diese Zeile eine Exception(ExceptionType::IndexOutOfRange), in die index und val eingefügt wurden? Oder verstehe ich etwas daran falsch?</p>
<p>Danke schon im Voraus.</p>
<p>mfg<br />
Mr X</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1830065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830065</guid><dc:creator><![CDATA[Mr X]]></dc:creator><pubDate>Wed, 30 Dec 2009 20:33:57 GMT</pubDate></item><item><title><![CDATA[Reply to operator &amp;lt;&amp;lt; überladen on Wed, 30 Dec 2009 20:42:58 GMT]]></title><description><![CDATA[<p>Ja, sollte so gehen. Der Ausdruck</p>
<pre><code class="language-cpp">Exception(ExceptionType::IndexOutOfRange)
</code></pre>
<p>erzeugt ein temporäres Objekt, auf den <code>operator&lt;&lt;</code> angewandt wird. Der Operator gibt wiederum ein temporäres Objekt zurück. Schlussendlich wirfst du das Resultat des gesamten Ausdrucks, also die Verkettung aller Einfügungen.</p>
<p>P.S.: Eine Alternative wäre <code>operator()</code> . Kann ja sein, dass dir das syntaktisch besser gefällt:</p>
<pre><code class="language-cpp">throw Exception(ExceptionType::IndexOutOfRange)(index)(val);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1830070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830070</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 30 Dec 2009 20:42:58 GMT</pubDate></item><item><title><![CDATA[Reply to operator &amp;lt;&amp;lt; überladen on Wed, 30 Dec 2009 20:42:42 GMT]]></title><description><![CDATA[<p>Ok, Danke.</p>
<p>Dann habe ich es ja geschafft, eine einfache Syntax für meine Klasse zu erzeugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1830071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830071</guid><dc:creator><![CDATA[Mr X]]></dc:creator><pubDate>Wed, 30 Dec 2009 20:42:42 GMT</pubDate></item><item><title><![CDATA[Reply to operator &amp;lt;&amp;lt; überladen on Wed, 30 Dec 2009 20:48:08 GMT]]></title><description><![CDATA[<p>Ich habe noch was reineditiert, das auch die Syntax betrifft. <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>Ach ja, und ich würde Const-Referenz-Parameter nehmen. Was mir auch noch aufgefallen ist: Der Operator sollte eine Referenz auf Non- <code>const</code> zurückgeben, sonst kann das Resultat nicht mehr verändert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1830072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830072</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 30 Dec 2009 20:48:08 GMT</pubDate></item><item><title><![CDATA[Reply to operator &amp;lt;&amp;lt; überladen on Wed, 30 Dec 2009 20:50:40 GMT]]></title><description><![CDATA[<p>Der operator&lt;&lt; gefällt mir irgendwie besser (STL-Stream-Klassen ähnlich).</p>
<p>Ich hab das jetzt so verändert:</p>
<pre><code class="language-cpp">class Exception {
    Exception&amp; operator&lt;&lt; (const std::string&amp; val) {
        Parameter.push_back(val);
        return(*this);
    }
};
</code></pre>
<p>Ich musste das const beim Rückgabetyp entfernen, weil die Referenz nicht const sein darf, da ich auf sie ja den nicht-konstanten operator&lt;&lt; ausführe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1830075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830075</guid><dc:creator><![CDATA[Mr X]]></dc:creator><pubDate>Wed, 30 Dec 2009 20:50:40 GMT</pubDate></item><item><title><![CDATA[Reply to operator &amp;lt;&amp;lt; überladen on Thu, 31 Dec 2009 12:41:37 GMT]]></title><description><![CDATA[<p>Nur so als genereller Hinweis:<br />
Bei Exception-Klassen solltest du aber vorsichtig sein bzgl. Memory-Allocation, sonst kriegst du evtl. darin dann eine OutOfMemory-Exception beim 'vector::push_back'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1830275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830275</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Thu, 31 Dec 2009 12:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to operator &amp;lt;&amp;lt; überladen on Thu, 31 Dec 2009 12:53:01 GMT]]></title><description><![CDATA[<p>eventuell=&quot;quasi nie, und wenn ja, war eh bereits alles verloren&quot;.</p>
<p>Ein Nachteil an der Klasse ist meiner Meinung nach, dass sie nicht von std::exception abgeleitet ist. Aber vielleicht ist das auch nur ein Codeausschnitt und im original ist sie das <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/1830278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830278</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 31 Dec 2009 12:53:01 GMT</pubDate></item><item><title><![CDATA[Reply to operator &amp;lt;&amp;lt; überladen on Thu, 31 Dec 2009 15:20:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">throw Exception(ExceptionType::IndexOutOfRange) &lt;&lt; index &lt;&lt; val;
</code></pre>
<p>sieht aber leicht eklig aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
wenn überhaupt dann würde ich so was hier schreiben wollen:</p>
<pre><code class="language-cpp">Exception e(ExceptionType::IndexOutOfRange);
e &lt;&lt; index &lt;&lt; val;
throw e;
</code></pre>
<p>den operator&lt;&lt; würde ich außerhalb der klasse definieren und die würde in etwa so aussehen:</p>
<pre><code class="language-cpp">struct Exception : std::runtime_error
{
/*CTOR und ggf. what() fehlt noch*/

  template&lt;typename T&gt;
  void to_add(const T&amp; to_add)
  {
    std::stringstream ss;
    ss &lt;&lt; to_add;
    to_add(ss.str());
  }

  void to_add(const std::string&amp; to_add)
  {
    data.push_back(to_add);
  }

private:
  std::vector&lt;std::string&gt; data;
};

template&lt;typename T&gt;
Exception&amp; (Exception&amp; these, const T&amp; to_add)
{
  Exception.Add(to_add);
  return these;
}

void test()
{
  int index;
  double val;

  std::cin &gt;&gt; index;
  val = 3.14159265*index;

  if(index &gt; 5)
  {
    Exception e(ExceptionType::IndexOutOfRange);
    e &lt;&lt; index &lt;&lt; val;
    throw e;
  }
}

int main()
{
  for(;;)
  {
    try
    {
      foo();
    }
    catch(Exception&amp; e)
    {
      std::cout &lt;&lt; &quot;cought: &quot; &lt;&lt; e.what() &lt;&lt; std::endl;
    }
  }
}
</code></pre>
<p>Wenn du mit der Exception auch bad_alloc signalisieren können möchtest, müsstest du im <code>to_add(std::string)</code> testen, ob dein enum bad_alloc sagt und wenn ja, dann einfach nichts machen. (aber eigtl wirst du ja bei bad_alloc kaum noch daten mitgeben wollen?!)<br />
Oder du schreibst dir nen Allokator, der Platz aufm Stack nimmt - iwo hier gibts nen STL-Allocator-Thread, dort hab ich heut früh oder so nen Bsp. gepostet, wie man so was machen könnte - du müsstest ihn nur etwas anpassen oder im ctor auch gleich nen reserve machen...<br />
dann hast du nur noch mit dem stringstream nen Problem - dem kannst du aber imho auch keinen allocator mitgeben...</p>
<p>den enum-ansatz würd ich btw auch nicht nehmen sondern mit templates arbeiten - dann könnte man den bad_alloc-Fall entsprechend spezialisieren...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1830337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830337</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 31 Dec 2009 15:20:12 GMT</pubDate></item><item><title><![CDATA[Reply to operator &amp;lt;&amp;lt; überladen on Fri, 01 Jan 2010 11:13:38 GMT]]></title><description><![CDATA[<p>unskilled, du hast etwas wichtiges (operator &lt;&lt;) vergessen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; 
Exception&amp; operator&lt;&lt;(Exception&amp; these, const T&amp; to_add) 
{ 
  Exception.Add(to_add); 
  return these; 
}
</code></pre>
<p>Oder meintest du, weil es ja im Titel des Beitrags steht, brauchst du es nicht noch mal hinschreiben? <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>P.S: what is &quot;cought:&quot;???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1830539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830539</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Fri, 01 Jan 2010 11:13:38 GMT</pubDate></item><item><title><![CDATA[Reply to operator &amp;lt;&amp;lt; überladen on Fri, 01 Jan 2010 14:50:36 GMT]]></title><description><![CDATA[<p>Th69 schrieb:</p>
<blockquote>
<p>P.S: what is &quot;cought:&quot;???</p>
</blockquote>
<p>Ein Schreibfehler <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
-&gt; catch -&gt; caught<br />
Etwas (ab)fangen, in dem Fall eine Exception.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1830589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830589</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Fri, 01 Jan 2010 14:50:36 GMT</pubDate></item><item><title><![CDATA[Reply to operator &amp;lt;&amp;lt; überladen on Sat, 02 Jan 2010 00:40:05 GMT]]></title><description><![CDATA[<p>1.:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; 
Exception&amp; (Exception&amp; these, const T&amp; to_add) 
{ 
  Exception.Add(to_add); 
  return these; 
}
</code></pre>
<p>hier fehlt einfach noch operator&lt;&lt; - sry^^<br />
so macht das stück hier natürlich nicht all zu viel sinn <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=";D"
      alt="😉"
    /></p>
<p>2.:<br />
wollt noch was zum knobeln übriglassen ;o)</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1830781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830781</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 02 Jan 2010 00:40:05 GMT</pubDate></item></channel></rss>