<?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[Buchlisting über für exceptions fehlerhaft]]></title><description><![CDATA[<p>Guten Tag, ich versuche mir gerade das Umgehen mit exceptions in C++ beizubringen. leider ihn Erfolg. Da ich herausgefunden habe, dass das Beispiel in meinem Buch fehlerhaft ist, würde ich gern wissen warum.<br />
Wenn man '0' eingibt, wird nur merkwürdiger Textsalat ausgegeben.</p>
<p>Wozu definiert er überhaupt das Element string s in KeineDatenMehr()?<br />
Warum gibt er einen Pointer auf eine lokale Variable zurück?</p>
<p>Ich benutze den Visual C++ Compiler 2010. Kann mir jemand erklären, wie das funktionieren soll?</p>
<p>Der Ausschnitt ist aus dem Buch Einstieg in C++ von galileo computing.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305330/buchlisting-über-für-exceptions-fehlerhaft</link><generator>RSS for Node</generator><lastBuildDate>Sun, 09 Aug 2026 01:15:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305330.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Jun 2012 13:34:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 13:34:37 GMT]]></title><description><![CDATA[<p>Guten Tag, ich versuche mir gerade das Umgehen mit exceptions in C++ beizubringen. leider ihn Erfolg. Da ich herausgefunden habe, dass das Beispiel in meinem Buch fehlerhaft ist, würde ich gern wissen warum.<br />
Wenn man '0' eingibt, wird nur merkwürdiger Textsalat ausgegeben.</p>
<p>Wozu definiert er überhaupt das Element string s in KeineDatenMehr()?<br />
Warum gibt er einen Pointer auf eine lokale Variable zurück?</p>
<p>Ich benutze den Visual C++ Compiler 2010. Kann mir jemand erklären, wie das funktionieren soll?</p>
<p>Der Ausschnitt ist aus dem Buch Einstieg in C++ von galileo computing.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227372</guid><dc:creator><![CDATA[Buchleser]]></dc:creator><pubDate>Tue, 26 Jun 2012 13:34:37 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 13:35:34 GMT]]></title><description><![CDATA[<p>Heute will echt nichts funktionieren... Sorry, dass ich das Listing vergessen habe -.-</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;exception&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
using namespace std;

// Meine eigene Basisklasse, abgeleitet von exception
class meaCulpa : public exception
{
public:
    meaCulpa(string s) {this-&gt;s = s;}
    virtual ~meaCulpa() throw() {}
    virtual const char * what() const throw()
        {return s.c_str();}
private:
    string s;
};

// Besonderer Fehler, wenn keine Daten mehr vorliegen
class KeineDatenMehr : public meaCulpa
{
public:
    KeineDatenMehr(int a) : meaCulpa(&quot; &quot;) {nr = a;}
    virtual ~KeineDatenMehr() throw() {}
    virtual const char * what() const throw();
private:
    int nr;
    string s;
};

// what() wird für eigene Fehlermeldung überschrieben
const char * KeineDatenMehr::what() const throw()
{
  ostringstream getNr;
  getNr &lt;&lt; &quot;Keine Daten mehr. Fehlernr.: &quot; &lt;&lt; nr;
  return getNr.str().c_str();
}

// Eine weitere Fehlerart wird von meaCulpa abgeleitet.
class QuelleFehlt : public meaCulpa
{
public:
    QuelleFehlt() : meaCulpa(&quot;Quelle fehlt&quot;) {}
};

// Tuwas simuliert die beiden Fehlerarten in Abhängigkeit vom
// Parameter
void Tuwas(int Problem) throw (KeineDatenMehr, QuelleFehlt)
{
    if (Problem==0)
    {
        throw KeineDatenMehr(8);
    }
    if (Problem==1)
    {
        throw QuelleFehlt();
    }
}

int main()
{
    // Problem-Nummer eingeben
    int Auswahl;
    cout &lt;&lt; &quot;Zahl zwischen 0 und 3 eingeben:&quot; &lt;&lt; endl;
    cin &gt;&gt; Auswahl;
    // Der try-Block fängt die Exception in Tuwas
    try
    {
        Tuwas(Auswahl);
    }
    // Fängt nur die eigenen Fehler
    catch(meaCulpa&amp; fehler)
    {
        cout &lt;&lt; fehler.what() &lt;&lt; endl;
    }
	cin.ignore(std::numeric_limits&lt;streamsize&gt;::max(), '\n');
	cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2227374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227374</guid><dc:creator><![CDATA[Buchleser]]></dc:creator><pubDate>Tue, 26 Jun 2012 13:35:34 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 13:49:38 GMT]]></title><description><![CDATA[<p>Typischer Anfängerfehler, wie nicht anders zu erwarten beim Galileoverlag:</p>
<pre><code class="language-cpp">const char * KeineDatenMehr::what() const throw()
{
  ostringstream getNr;
  getNr &lt;&lt; &quot;Keine Daten mehr. Fehlernr.: &quot; &lt;&lt; nr;
  return getNr.str().c_str();
}
</code></pre>
<p>Hier gibst du einen Verweis auf ein lokales Objekt zurück. Dieses existiert aber nicht mehr, nachdem die Funktion verlassen wurde.</p>
<p>Wie immer gilt: Finger weg vom Galileoverlag! Siehe zweiter Link in meiner Signatur.</p>
<p>P.S.: Exceptionspezifikationen an Funktionen gelten als &quot;evil&quot; und sind im neuen Standard auf veraltet gesetzt worden. Sehr gut oder aktuell ist das Thema des Buches also auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227377</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 26 Jun 2012 13:49:38 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 13:46:08 GMT]]></title><description><![CDATA[<p>Der Code ist grauenhaft. Du hast ja schon die Fehler erkannt. Er gibt einen Pointer auf eine lokale Variable zurück und deshalb erhältst du bei der Ausgabe Textsalat. Vielleicht wollte er den String nach s kopieren. Ansonsten ergibt s keinen Sinn in KeineDatenMehr. Und Exceptionspecifications (Z.48) sollte man einfach nicht benutzen. Wurden die in C++11 nicht eh deprecated?</p>
<p>Wenn der Code aus einem Buch stammt, dann würde ich dir ganz klar empfehlen ein andere Buch zu benutzen. zB <a href="http://stroustrup.com/Programming/" rel="nofollow">http://stroustrup.com/Programming/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227378</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Tue, 26 Jun 2012 13:46:08 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 13:51:16 GMT]]></title><description><![CDATA[<p>Ist das wieder JW?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227384</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 26 Jun 2012 13:51:16 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 14:06:54 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Ist das wieder JW?</p>
</blockquote>
<p>Nein, Willemer. Anscheinend auch nicht besser</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227391</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 26 Jun 2012 14:06:54 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 14:15:47 GMT]]></title><description><![CDATA[<p>Danke euch! Ich habe es mittlerweile geschafft, den Quelltext zu korrigieren. Allerdings verstehe ich nicht, warum diese Version nicht funktioniert.<br />
Ich habe schliesslich das Stringstreamobjekt innerhalb der Klasse deklariert, sodass es bei der Rückkehr der Funktion nicht gelöscht werden sollte.</p>
<p>Folgenden Fehler bekomme ich von meinem Compiler:</p>
<blockquote>
<p>1&gt;d:\programme\microsoft visual studio 10.0\vc\include\sstream(724): error C2248: &quot;std::basic_ios&lt;_Elem,_Traits&gt;::basic_ios&quot;: Kein Zugriff auf private Member, dessen Deklaration in der std::basic_ios&lt;_Elem,_Traits&gt;-Klasse erfolgte.</p>
</blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;exception&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
using namespace std;

// Meine eigene Basisklasse, abgeleitet von exception
class meaCulpa : public exception
{
public:
    meaCulpa(string s) {this-&gt;s = s;}
    virtual ~meaCulpa() {}
    virtual const char * what()
        {return s.c_str();}
private:
    string s;
};

// Besonderer Fehler, wenn keine Daten mehr vorliegen
class KeineDatenMehr : public meaCulpa
{
public:
    KeineDatenMehr(int a) : meaCulpa(&quot; &quot;) {nr = a;}
    virtual ~KeineDatenMehr(){}
    virtual const char * what();
private:
    int nr;
    stringstream myStream; //stringstream ist jetzt innerhalb der Klasse, string s gelöscht
};

// what() wird für eigene Fehlermeldung überschrieben
const char * KeineDatenMehr::what()
{
  myStream &lt;&lt; &quot;Keine Daten mehr. Fehlernr.: &quot; &lt;&lt; nr;
  return myStream.str().c_str();
}

// Eine weitere Fehlerart wird von meaCulpa abgeleitet.
class QuelleFehlt : public meaCulpa
{
public:
    QuelleFehlt() : meaCulpa(&quot;Quelle fehlt&quot;) {}
};

// Tuwas simuliert die beiden Fehlerarten in Abhängigkeit vom
// Parameter
void Tuwas(int Problem)
{
    if (Problem==0)
    {
        throw KeineDatenMehr(8);
    }
    if (Problem==1)
    {
        throw QuelleFehlt();
    }
}

int main()
{
    // Problem-Nummer eingeben
    int Auswahl;
    cout &lt;&lt; &quot;Zahl zwischen 0 und 3 eingeben:&quot; &lt;&lt; endl;
    cin &gt;&gt; Auswahl;
    // Der try-Block fängt die Exception in Tuwas
    try
    {
        Tuwas(Auswahl);
    }
    // Fängt nur die eigenen Fehler
    catch(meaCulpa&amp; fehler)
    {
        cout &lt;&lt; fehler.what() &lt;&lt; endl;
    }
    cin.ignore(std::numeric_limits&lt;streamsize&gt;::max(), '\n');
    cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2227398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227398</guid><dc:creator><![CDATA[Buchleser]]></dc:creator><pubDate>Tue, 26 Jun 2012 14:15:47 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 14:22:39 GMT]]></title><description><![CDATA[<p>Da dürfte es um den Kopierkonstruktor gehen. Die Streams sind generell nicht kopierbar. Wenn jetzt der Compiler für deine Klasse KeineDatenMehr einen Kopierkonstruktor generiert, ruft er dort drin die Kopierkonstruktoren aller Membervariablen auf ... aber stringstream besitzt keinen bzw. lediglich einen, der private ist.</p>
<p>Ich seh auch nicht ganz, wozu das gut sein soll. Speicher dir doch den String und nicht den Stream...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227401</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 26 Jun 2012 14:22:39 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 14:26:42 GMT]]></title><description><![CDATA[<p>Ok, ich dachte ich könnte damit den Speicherplatz für den String sparen, aber das ist eigentlich irrelevant, weil der Stringstream eh nach der Ausführung der Funktion gelöscht wird...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227404</guid><dc:creator><![CDATA[Buchleser]]></dc:creator><pubDate>Tue, 26 Jun 2012 14:26:42 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 14:30:42 GMT]]></title><description><![CDATA[<p>Und der Stream belegt wohl keinen Speicher? <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>Ich würde mal vorschlagen: Wegwerfen und neumachen. Es sei denn du hast Spaß daran das verkorkste Vorbild aus dem Buch glattzuziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227407</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 26 Jun 2012 14:30:42 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 14:46:14 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich würde mal vorschlagen: Wegwerfen und neumachen. Es sei denn du hast Spaß daran das verkorkste Vorbild aus dem Buch glattzuziehen.</p>
</blockquote>
<p>Da hast du wohl oder übel recht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<blockquote>
<p>Und der Stream belegt wohl keinen Speicher? <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>
</blockquote>
<p>Den Stream brauche ich ja so oder so zum Erstellen des strings für what(). Den String würde ich theoretisch nicht benötigen, wenn ich den String innerhalb der Funktion über sstream.str().c_str() zurückgeben könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227414</guid><dc:creator><![CDATA[Buchleser]]></dc:creator><pubDate>Tue, 26 Jun 2012 14:46:14 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 14:53:56 GMT]]></title><description><![CDATA[<p>Gib doch bei what() einfach einen String zurück, anstatt einem char*.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227419</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 26 Jun 2012 14:53:56 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 14:57:07 GMT]]></title><description><![CDATA[<p>Buchleser schrieb:</p>
<blockquote>
<blockquote>
<p>Und der Stream belegt wohl keinen Speicher? <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>
</blockquote>
<p>Den Stream brauche ich ja so oder so zum Erstellen des strings für what().</p>
</blockquote>
<p>Aber nur lokal. Ich dachte es ginge dir um den Speicher, den das Exception-Objekt benötigt.</p>
<p>Mir fällt übrigens grade ein, dass es auch nicht gehen würde, wenn stringstream kopierbar wäre.</p>
<p>Bei</p>
<pre><code class="language-cpp">return sstream.str().c_str();
</code></pre>
<p>wird ja ein temporärer <code>string</code> erzeugt und auf diesen <code>c_str()</code> aufgerufen. Der <code>string</code> existiert damit außerhalb von <code>what()</code> nicht mehr, so dass der <code>char</code> -Zeiger ungültig ist.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Gib doch bei what() einfach einen String zurück, anstatt einem char*.</p>
</blockquote>
<p>Er hält sich an die Vorgabe von <code>std::exception</code> . Würdest du deine eigene Exception-Hierarchie nebenher bauen, um ein <code>what</code> mit <code>string</code> -Rückgabe zu haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227420</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 26 Jun 2012 14:57:07 GMT</pubDate></item><item><title><![CDATA[Reply to Buchlisting über für exceptions fehlerhaft on Tue, 26 Jun 2012 16:32:43 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class KeineDatenMehr : public meaCulpa {
public:
  KeineDatenMehr(int nr) : meaCulpa(&quot;Fehler nummer: &quot; + std::to_string(nr)) { }
  virtual ~KeineDatenMehr() throw() {}
};
</code></pre>
<p><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/2227457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227457</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Tue, 26 Jun 2012 16:32:43 GMT</pubDate></item></channel></rss>