<?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[Destruktor im Konstruktor ??]]></title><description><![CDATA[<p>Guten Morgen,</p>
<p>hatte jetzt viel über Klassen gelesen in meinem Lehrbuch (Primer), und wollte mich jetzt mal an eine eigene gaaaanz ganz simple Klasse machen... .<br />
Also funktionieren tut alles soweit( Kein wunder bei dieser wahnsinns anwendung).</p>
<p>Jedoch ist meine Frage wie man das mit dem Konstruktor generell &quot;richtig&quot; macht.<br />
Sprich : Wenn im Konstruktor was schief läuft will ich kein Objekt bzw. kein ungültiges Objekt hinterlassen. Wenn ich da jetzt den Destruktor aufrufe... ok, das sieht erst mal gut aus... Aber beim Verlassen des Gültigkeitsbereich´s hier hald main, wird der Destruktor nochmals aufgerufen. Kann das dann nicht in die Hose gehen?</p>
<p>Hier mal der Code, das durchgemische von mal this-&gt; und mal nicht bitte ich zu übersehen, war viel &quot;Probier mal alles gelesene aus&quot;.</p>
<p>temp.hpp:</p>
<pre><code>class temp{

public: 

	 temp(std::string input);
	 ~temp();

	 void cel();
	 void fah();

private:

	 float value_;
	 float cel_;
	 float fah_;
	 const float to_cel_ =  0.556;
	 const float to_fah_ =  1.8;
	 const float fahr_ = 32.0;

	 void init(std::string &amp;buff);	

} ;
</code></pre>
<p>temp.cpp:</p>
<pre><code>temp::temp(std::string input){

	 init(input);
}

temp::~temp(){

//	std::cout &lt;&lt; &quot;Temperature Object destroyed\n&quot;;
}

void temp::init(std::string &amp;buff){

	this-&gt;fah_ = 0.0;
	this-&gt;cel_ = 0.0;

	std::stringstream buffer(buff);
	buffer &gt;&gt; this-&gt;value_ ;

	if (buffer.fail()){
		std::cout &lt;&lt; &quot;Your Input String is not Valid\n&quot;;
		this-&gt;~temp();                            // Hier habe ich starke Zweifel!!?!?
		exit(911);
	}/*else{
		std::cout &lt;&lt; &quot;\nInit Done. Object Created\n&quot;;
	} */

} 

void temp::cel(){

	this-&gt;cel_ = (value_ - fahr_) * to_cel_;
	std::cout &lt;&lt; &quot;\n&quot; &lt;&lt;  value_ &lt;&lt; &quot; ==&gt;&gt; &quot; &lt;&lt; this-&gt;cel_ &lt;&lt; static_cast&lt;char&gt;(248) &lt;&lt; &quot; Celsius\n&quot;;	

}

void temp::fah(){

	this-&gt;fah_ = (value_ * to_fah_) + fahr_; 
	std::cout &lt;&lt; &quot;\n&quot; &lt;&lt; value_ &lt;&lt; &quot; ==&gt;&gt; &quot; &lt;&lt; std::fixed &lt;&lt; std::setprecision(1) &lt;&lt;  this-&gt;fah_ &lt;&lt; static_cast&lt;char&gt;(248) &lt;&lt; &quot; Fahrenheit\n&quot;;

 }
</code></pre>
<p>Meine Frage ist nun, wie macht man das richtig? Solte das eher in die Richtung Try Catch gehen, oder oder oder... ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/329561/destruktor-im-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 18:51:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/329561.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Nov 2014 06:58:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 06:58:07 GMT]]></title><description><![CDATA[<p>Guten Morgen,</p>
<p>hatte jetzt viel über Klassen gelesen in meinem Lehrbuch (Primer), und wollte mich jetzt mal an eine eigene gaaaanz ganz simple Klasse machen... .<br />
Also funktionieren tut alles soweit( Kein wunder bei dieser wahnsinns anwendung).</p>
<p>Jedoch ist meine Frage wie man das mit dem Konstruktor generell &quot;richtig&quot; macht.<br />
Sprich : Wenn im Konstruktor was schief läuft will ich kein Objekt bzw. kein ungültiges Objekt hinterlassen. Wenn ich da jetzt den Destruktor aufrufe... ok, das sieht erst mal gut aus... Aber beim Verlassen des Gültigkeitsbereich´s hier hald main, wird der Destruktor nochmals aufgerufen. Kann das dann nicht in die Hose gehen?</p>
<p>Hier mal der Code, das durchgemische von mal this-&gt; und mal nicht bitte ich zu übersehen, war viel &quot;Probier mal alles gelesene aus&quot;.</p>
<p>temp.hpp:</p>
<pre><code>class temp{

public: 

	 temp(std::string input);
	 ~temp();

	 void cel();
	 void fah();

private:

	 float value_;
	 float cel_;
	 float fah_;
	 const float to_cel_ =  0.556;
	 const float to_fah_ =  1.8;
	 const float fahr_ = 32.0;

	 void init(std::string &amp;buff);	

} ;
</code></pre>
<p>temp.cpp:</p>
<pre><code>temp::temp(std::string input){

	 init(input);
}

temp::~temp(){

//	std::cout &lt;&lt; &quot;Temperature Object destroyed\n&quot;;
}

void temp::init(std::string &amp;buff){

	this-&gt;fah_ = 0.0;
	this-&gt;cel_ = 0.0;

	std::stringstream buffer(buff);
	buffer &gt;&gt; this-&gt;value_ ;

	if (buffer.fail()){
		std::cout &lt;&lt; &quot;Your Input String is not Valid\n&quot;;
		this-&gt;~temp();                            // Hier habe ich starke Zweifel!!?!?
		exit(911);
	}/*else{
		std::cout &lt;&lt; &quot;\nInit Done. Object Created\n&quot;;
	} */

} 

void temp::cel(){

	this-&gt;cel_ = (value_ - fahr_) * to_cel_;
	std::cout &lt;&lt; &quot;\n&quot; &lt;&lt;  value_ &lt;&lt; &quot; ==&gt;&gt; &quot; &lt;&lt; this-&gt;cel_ &lt;&lt; static_cast&lt;char&gt;(248) &lt;&lt; &quot; Celsius\n&quot;;	

}

void temp::fah(){

	this-&gt;fah_ = (value_ * to_fah_) + fahr_; 
	std::cout &lt;&lt; &quot;\n&quot; &lt;&lt; value_ &lt;&lt; &quot; ==&gt;&gt; &quot; &lt;&lt; std::fixed &lt;&lt; std::setprecision(1) &lt;&lt;  this-&gt;fah_ &lt;&lt; static_cast&lt;char&gt;(248) &lt;&lt; &quot; Fahrenheit\n&quot;;

 }
</code></pre>
<p>Meine Frage ist nun, wie macht man das richtig? Solte das eher in die Richtung Try Catch gehen, oder oder oder... ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429947</guid><dc:creator><![CDATA[cpp_beginner]]></dc:creator><pubDate>Fri, 28 Nov 2014 06:58:07 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 07:12:24 GMT]]></title><description><![CDATA[<p>Faustregeln:<br />
Man ruft den Destruktor nicht auf.<br />
Man schreibt keinen Destruktor, wenn es nichts zu tun gibt.<br />
Im Fehlerfall wirft man eine Exception.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429948</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 28 Nov 2014 07:12:24 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 07:16:44 GMT]]></title><description><![CDATA[<p>Also erstmal könntest du das hier:</p>
<pre><code>this-&gt;fah_ = 0.0;
this-&gt;cel_ = 0.0;
</code></pre>
<p>in den Konstruktor packen, denn exact dafür ist er da, dein Objekt initialisieren. Wofür braucht man da denn noch eine init() Funktion. Ist doch doppel-gemoppelt, oder nicht? Außerdem könntest du `value_` bzw dein Objekt doch gleich eine Zahl als Parameter übergeben. Also temp(float input);</p>
<p>Aber mal so allgemein, ich denke das ist schon in Ordnung eine Exception im Konstruktor zu thrown, wenn etwas ziemlich schief geht. Davon, dass man im Konstruktor einen Destruktor aufruft habe ich noch nicht gehört, aber da musst du auf die Anderen warten, die wissen da noch ein bissle mehr.</p>
<p>Auf jeden Fall ist doch das hier:</p>
<pre><code>temp::temp(float input) :
value_ {input},
fah_ {0},
cel_ {0}
{
}
</code></pre>
<p>Leichter als</p>
<pre><code>temp::temp(std::string input){

     init(input);
}

void temp::init(std::string &amp;buff){

    this-&gt;fah_ = 0.0;
    this-&gt;cel_ = 0.0;

    std::stringstream buffer(buff);
    buffer &gt;&gt; this-&gt;value_ ;

    if (buffer.fail()){
        std::cout &lt;&lt; &quot;Your Input String is not Valid\n&quot;;
        this-&gt;~temp();                            // Hier habe ich starke Zweifel!!?!?
        exit(911);
    }/*else{
        std::cout &lt;&lt; &quot;\nInit Done. Object Created\n&quot;;
    } */

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2429950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429950</guid><dc:creator><![CDATA[hardware]]></dc:creator><pubDate>Fri, 28 Nov 2014 07:16:44 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 07:50:59 GMT]]></title><description><![CDATA[<p>cpp_beginner schrieb:</p>
<blockquote>
<p>Sprich : Wenn im Konstruktor was schief läuft will ich kein Objekt bzw. kein ungültiges Objekt hinterlassen.</p>
</blockquote>
<p>Wenn es tatsächlich mal nicht möglich sein sollte, dass der Konstruktor ein gültiges Objekt erstellt (was aber eigentlich die Ausnahme sein sollte), dann sollte eine Exception geworfen werden. Die räumt erst mal alles im Konstruktor evtl. lokal angelegte weg und hinterlässt dann auch keine Reste.<br />
Es gibt wohl ein paar ganz exotische Fälle, wo man selbst explizit einen Destruktor aufruft (aber nicht im Konstruktor!), aber im Normalfall sollte man das unterlassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429952</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 28 Nov 2014 07:50:59 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 08:24:07 GMT]]></title><description><![CDATA[<p>Ok, danke erstmal.</p>
<p>Wie würde das mit der Exception im Konstruktor dann aussehn? Also der Try Catch Block im Konstruktor oder ausserhalb der Klasse ? (Try Klasse erstellen, die Klasse wirft... Oder im Konstruktor irgendwas prüfen und dann nur throw..?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429954</guid><dc:creator><![CDATA[beginner_offl]]></dc:creator><pubDate>Fri, 28 Nov 2014 08:24:07 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 09:15:58 GMT]]></title><description><![CDATA[<p>Der Konstruktor wirft die Exception:</p>
<pre><code>class A
{
   public:
      A(){/*Falls ich kein vernünftiges Objekt erstellen kann:*/
            throw &quot;Fehler&quot;;}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2429959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429959</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 28 Nov 2014 09:15:58 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 09:22:27 GMT]]></title><description><![CDATA[<p>Dann muss aber in der Main , das &quot;Anlegen&quot; des Objekts im Try Block stehen... Somit ist aber auch der Folgecode, der mit dem Objekt arbeitet nur im Try Block gültig, ausser ich wurschtel mit nem Zeiger rum...</p>
<p>Macht man das wirklich so? Ich hab noch nicht soviel mit Try und Catch gemacht, aber wird das dann nicht irgendwann uferlos?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429962</guid><dc:creator><![CDATA[beg_offl]]></dc:creator><pubDate>Fri, 28 Nov 2014 09:22:27 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 09:40:05 GMT]]></title><description><![CDATA[<p>Ist der Zugriff über den Pointer überhaupt &quot;gültig&quot;? Das Objekt wurde ja eigentlich beim Verlassen des Try Blocks vom Destruktor zerstört...</p>
<pre><code>int main() {

temp *pt1 = nullptr;

try {

	temp T1(&quot;12&quot;);
	pt1 = &amp;T1;
}catch(const char *Error){
	std::cerr &lt;&lt; Error;
}

if (pt1 != nullptr){

	pt1-&gt;cel();
	pt1-&gt;fah();
}
</code></pre>
<p>Konstruktor ungefähr so :</p>
<pre><code>temp::temp(std::string input){

	this-&gt;fah_ = 0.0;
	this-&gt;cel_ = 0.0;

	std::stringstream buffer(input);
	buffer &gt;&gt; this-&gt;value_ ;

	if (buffer.fail()){
	    throw &quot;Error in passed String&quot;;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2429963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429963</guid><dc:creator><![CDATA[beg_offl]]></dc:creator><pubDate>Fri, 28 Nov 2014 09:40:05 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 09:44:07 GMT]]></title><description><![CDATA[<p>Uferlos? Irgendwann vielleicht <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>Genau, T1 ist außerhalb des try{} schon tot! pt1 zeigt dann... genau!<br />
Also besser so:</p>
<pre><code>unique_ptr&lt;tmp&gt; uptr;
try
{
    uptr.reset(new temp(...));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2429964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429964</guid><dc:creator><![CDATA[Hi]]></dc:creator><pubDate>Fri, 28 Nov 2014 09:44:07 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 09:45:37 GMT]]></title><description><![CDATA[<p>beg_offl schrieb:</p>
<blockquote>
<p>Dann muss aber in der Main , das &quot;Anlegen&quot; des Objekts im Try Block stehen...</p>
</blockquote>
<p>Ja, und? Exceptions sind halt da. Schon sobald du irgendwelche dynamischen Datenstrukturen wie string oder vector benutzt, steht die Möglichkeit eines bad_alloc im Raum.</p>
<p>Bezogen auf das andere Posting, der try-Block muss natürlich nicht nur das Erzeugen des Objektes umfassen. Andernfalls müsstest du das Objekt mit new erzeugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429965</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 28 Nov 2014 09:45:37 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 09:47:28 GMT]]></title><description><![CDATA[<p>1. Wie gesagt, ist es eher die Ausnahme, dass ein Objekt nicht erstellt werden kann.<br />
2. Wenn aber doch mal, zB ein Datenbankobjekt nicht erstellt werden kann, dann kann man in aller Regel nicht weiterarbeiten, sondern beendet das Programm kontrolliert, oder gibt eine Fehlermeldung aus, oder ...<br />
3. Der Folgecode muss ja nicht in der main stehen:</p>
<pre><code>int main()
{
   try
   {
      DBObjekt db;
      arbeiteMit(db);
   }
   catch(...)
   {
      cout &lt;&lt; &quot;DB nicht verfügbar&quot;;
   }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2429966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429966</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 28 Nov 2014 09:47:28 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 10:53:13 GMT]]></title><description><![CDATA[<p>beg_offl schrieb:</p>
<blockquote>
<p>Macht man das wirklich so? Ich hab noch nicht soviel mit Try und Catch gemacht, aber wird das dann nicht irgendwann uferlos?</p>
</blockquote>
<p>Du meinst uferlos weil du dann überall wo du ein solches Objekt erstellst einen try-catch block schreiben musst?</p>
<p>Also ich mach das immer ungefähr so:</p>
<pre><code>#include &lt;iostream&gt;

int my_main() {
    // Hier die &quot;echte&quot; main in der alles gemacht wird
}

int main() {
    // Hier wird nur &quot;my_main&quot; aufgerufen
    try {
        return my_main();
    }
    catch (std::exception const &amp;ex) {
        std::cerr &lt;&lt; ex.what() &lt;&lt; '\n';
    }
}
</code></pre>
<p>Dann kannst du dir sicher sein dass du eine Fehlermeldung bekommst wenn eine exception geworfen wird und du musst den try-catch block nur einmal schreiben. Natürlich kannst du lokal in my_main (oder von diesem aufgerufenen Unterfunktionen) noch weitere try-catch Blöcke einfügen um diese gegebenenfalls anders zu behandeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429969</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Fri, 28 Nov 2014 10:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 10:55:50 GMT]]></title><description><![CDATA[<p>beg_offl schrieb:</p>
<blockquote>
<p>Ist der Zugriff über den Pointer überhaupt &quot;gültig&quot;? Das Objekt wurde ja eigentlich beim Verlassen des Try Blocks vom Destruktor zerstört...</p>
<pre><code>int main() {
	
temp *pt1 = nullptr;
	
try {
	
	temp T1(&quot;12&quot;);
	pt1 = &amp;T1;
}catch(const char *Error){
	std::cerr &lt;&lt; Error;
}

if (pt1 != nullptr){
	
	pt1-&gt;cel();
	pt1-&gt;fah();
}
</code></pre>
</blockquote>
<p>Sicher ist das falsch. Zeiger auf lokale Objekte sind immer gefährlich. Um nicht zu sagen: Zeiger sind eigentlich immer gefährlich und werden leider viel zu oft verwendet.</p>
<p>Hier ist ein Beispiel, was man mit Zeigern eben genau nicht machen soll. Und wie man mit try-catch nicht um gehen sollte. Ich habe in der Regel ein try-catch in meiner main und sonst im Code eher selten. In Deinem Beispiel sagst Du ja: fange den Fehler, gebe ihn aus und dann machst Du weiter. Warum willst Du weiter machen, wenn es doch nicht geklappt hat. Und diese Abfrage auf nullptr kannst Du ganz einfach weg lassen, indem Du die Verarbeitung in das try integrierst:</p>
<pre><code>int main() {

try {
	temp T1(&quot;12&quot;);
	pt1-&gt;cel();
	pt1-&gt;fah();
}catch(const char *Error){
	std::cerr &lt;&lt; Error;
}
</code></pre>
<p>Fragt sich natürlich, warum Du den Zeiger überhaupt benötigst.</p>
<p>Ausserdem sollte man keinen <code>const char*</code> als exception werfen. Mach lieber ein <code>throw std::runtime_error</code> und ein <code>catch (const std::exception&amp; e)...</code> . Dann sind wir schon relativ nah am Code von Belli (den ich so auch nicht schreiben würde, da hier die Annahme vor liegt, dass wenn irgendeine exception fliegt automatisch die &quot;DB nicht verfügbar&quot; ist. Hier meine Variante:</p>
<pre><code>int main()
{
  try
  {
	temp T1(&quot;12&quot;);
	T1.cel();
	T1.fah();
  }
  catch(const std::exception&amp; e)
  {
	std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
  }
}
</code></pre>
<p>Einfach, übersichtlich und robust halt. Ich sollte noch erwähnen, dass ich C++ liebe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429970</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Fri, 28 Nov 2014 10:55:50 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 11:19:15 GMT]]></title><description><![CDATA[<p>Aha. Also danke erstmal für die anschaulichen Beispiele, ich hab das soweit verstanden und werde das in Zukunft so oder so ähnlich umsetzen.</p>
<blockquote>
<p>Fragt sich natürlich, warum Du den Zeiger überhaupt benötigst.</p>
</blockquote>
<p>von cpp_tutor.de oder so :</p>
<blockquote>
<p>Soll ein Objekt innerhalb eines try-Blocks erstellt und danach auch außerhalb des Blocks zur Verfügung stehen, so muss ein entsprechender Objektzeiger, der natürlich außerhalb des try-Blocks definiert wird, eingesetzt werden. <strong>Vergessen Sie dabei aber nicht, dass im Fehlerfall das Objekt eventuell nicht gültig ist</strong></p>
</blockquote>
<p>[quote]</p>
<p>=&gt;Wollte das in die Richtung umsetzten, hab aber dabei schon gemerkt das es käse ist, da auch wenn kein Fehler vorliegt, der Destruktor beim Verlassen des Try Blocks durchläuft.</p>
<p>Würde es etwas ändern irgendwie mit new zu arbeiten, oder ist hier wirklich uniuque_ptr die Lösung ? (also für &quot;Im Block erstellen&quot;, aúßerhalb damit arbeiten... oder geht es hald einfach gar nicht...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2429973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2429973</guid><dc:creator><![CDATA[beg_offl]]></dc:creator><pubDate>Fri, 28 Nov 2014 11:19:15 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 19:05:24 GMT]]></title><description><![CDATA[<p>unique_ptr ist hier die beste Lösung, raw pointer mit new geht auch, ist allerdings nie so gut wie ein smart pointer. Die Gründe kann man in jedem C++-Forenbeitrag nachlesen, in dem jemand new ohne smart pointer nutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430050</guid><dc:creator><![CDATA[patrick246]]></dc:creator><pubDate>Fri, 28 Nov 2014 19:05:24 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 19:16:28 GMT]]></title><description><![CDATA[<blockquote>
<p>raw pointer mit new geht auch</p>
</blockquote>
<p>Kann das bitte jmd. zeigen? Also wie man mit new (obwohl man nicht machen soll) das ganze löst?</p>
<blockquote>
<p>Ich habe in der Regel ein try-catch in meiner main und sonst im Code eher selten.</p>
</blockquote>
<p>Quasi so :??:</p>
<pre><code>int main(){

try{
   mein_code() // also so ähnlich wie bei happystudent, in mein_code wird =&gt;ALLES&lt;= verwaltet??
}catch(//wie auch immer...){
  //sth. else...
}

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2430051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430051</guid><dc:creator><![CDATA[beg_offl]]></dc:creator><pubDate>Fri, 28 Nov 2014 19:16:28 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 19:40:41 GMT]]></title><description><![CDATA[<p>Gutes Exception Handling funktioniert quasi komplett ohne try/catch.</p>
<p>Also ein paar try/catch sind notwendig, aber sehr sehr sehr sehr sehr sehr sehr sehr sehr wenige.</p>
<p>Siehe:<br />
<a href="http://magazin.c-plusplus.net/artikel/Exception-Handling" rel="nofollow">http://magazin.c-plusplus.net/artikel/Exception-Handling</a><br />
<a href="http://magazin.c-plusplus.net/artikel/Modernes%20Exception-Handling%20Teil%201%20-%20Die%20Grundlagen" rel="nofollow">http://magazin.c-plusplus.net/artikel/Modernes Exception-Handling Teil 1 - Die Grundlagen</a><br />
<a href="http://magazin.c-plusplus.net/artikel/Modernes%20Exception-Handling%20Teil%202%20-%20Hinter%20den%20Kulissen" rel="nofollow">http://magazin.c-plusplus.net/artikel/Modernes Exception-Handling Teil 2 - Hinter den Kulissen</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430056</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 28 Nov 2014 19:40:41 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 19:55:35 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Also ein paar try/catch sind notwendig, aber sehr sehr sehr sehr sehr sehr sehr sehr sehr wenige.</p>
</blockquote>
<p>Ich finde, das sollte man nicht so pauschalisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430059</guid><dc:creator><![CDATA[Hi]]></dc:creator><pubDate>Fri, 28 Nov 2014 19:55:35 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Fri, 28 Nov 2014 20:57:04 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>beg_offl schrieb:</p>
<blockquote>
<p>Macht man das wirklich so? Ich hab noch nicht soviel mit Try und Catch gemacht, aber wird das dann nicht irgendwann uferlos?</p>
</blockquote>
<p>Du meinst uferlos weil du dann überall wo du ein solches Objekt erstellst einen try-catch block schreiben musst?</p>
<p>Also ich mach das immer ungefähr so:</p>
<pre><code>#include &lt;iostream&gt;

int my_main() {
    // Hier die &quot;echte&quot; main in der alles gemacht wird
}

int main() {
    // Hier wird nur &quot;my_main&quot; aufgerufen
    try {
        return my_main();
    }
    catch (std::exception const &amp;ex) {
        std::cerr &lt;&lt; ex.what() &lt;&lt; '\n';
    }
}
</code></pre>
<p>Dann kannst du dir sicher sein dass du eine Fehlermeldung bekommst wenn eine exception geworfen wird und du musst den try-catch block nur einmal schreiben. Natürlich kannst du lokal in my_main (oder von diesem aufgerufenen Unterfunktionen) noch weitere try-catch Blöcke einfügen um diese gegebenenfalls anders zu behandeln.</p>
</blockquote>
<p>Auf welcher (hosted) Implementierung arbeitest du denn, die dir keine Rückmeldung über ungefangene Exceptions beim Abbruch gibt? Und selbst wenn du paranoiderweise annimmst, dass deine Umgebung nicht das tut, was du hier von Hand versuchst, wäre es wohl immer noch deutlich übersichtlicher, einen entsprechenden terminate-Handler zu setzen. Und noch einen unexcepted-Handler für die paranoid²-Absicherung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430073</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 28 Nov 2014 20:57:04 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Sat, 29 Nov 2014 05:56:24 GMT]]></title><description><![CDATA[<p>Also so nicht machen. Verstanden...<br />
SeppJ, nicht falsch verstehen, aber wie würdest du es generell machen, als &quot;Großmeister&quot; ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430097</guid><dc:creator><![CDATA[beg_off]]></dc:creator><pubDate>Sat, 29 Nov 2014 05:56:24 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Sat, 29 Nov 2014 06:49:14 GMT]]></title><description><![CDATA[<p>beg_off schrieb:</p>
<blockquote>
<p>SeppJ, nicht falsch verstehen, aber wie würdest du es generell machen, als &quot;Großmeister&quot; ?</p>
</blockquote>
<p>Siehe Shade of Mines Beiträge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430100</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 29 Nov 2014 06:49:14 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Sat, 29 Nov 2014 07:41:58 GMT]]></title><description><![CDATA[<p>Oh, Sorry übersehen. Das zieh ich mir mal rein.</p>
<p>evtl. noch was zu</p>
<blockquote>
<p>raw pointer mit new geht auch</p>
<p>Kann das bitte jmd. zeigen? Also wie man mit new (obwohl man nicht machen soll) das ganze löst?</p>
</blockquote>
<p>???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430103</guid><dc:creator><![CDATA[beg_of]]></dc:creator><pubDate>Sat, 29 Nov 2014 07:41:58 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Sat, 29 Nov 2014 08:18:39 GMT]]></title><description><![CDATA[<p>Hast du das etwa auch übersehen?</p>
<p>Hi schrieb:</p>
<blockquote>
<pre><code>unique_ptr&lt;tmp&gt; uptr;
try
{
    uptr.reset(new temp(...));
}
</code></pre>
</blockquote>
<p>Mit nem rohen Zeiger geht es genauso.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430105</guid><dc:creator><![CDATA[Hi]]></dc:creator><pubDate>Sat, 29 Nov 2014 08:18:39 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Sat, 29 Nov 2014 08:31:15 GMT]]></title><description><![CDATA[<p>Nö, aber falsch verstanden.<br />
Besten Dank an alle!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430107</guid><dc:creator><![CDATA[beg_offl]]></dc:creator><pubDate>Sat, 29 Nov 2014 08:31:15 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Sat, 29 Nov 2014 10:18:24 GMT]]></title><description><![CDATA[<p>Man schreibt einen try/catch Block wenn man eine Exception sinnvoll behandeln kann. Ansonsten lässt man sie weitersegeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430116</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 29 Nov 2014 10:18:24 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor im Konstruktor ?? on Mon, 15 Dec 2014 09:43:48 GMT]]></title><description><![CDATA[<blockquote>
<p>Hast du das etwa auch übersehen?</p>
<p>Hi schrieb:</p>
<pre><code>unique_ptr&lt;tmp&gt; uptr;
try
{
    uptr.reset(new temp(...));
}
</code></pre>
<p>Mit nem rohen Zeiger geht es genauso.</p>
</blockquote>
<p>Gibt es überhaupt eine möglichkeit ein Objekt oder Variable die in einem Try / Catch Block erzeugt wird, außerhalbe dieses Blockes zu benutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2432910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2432910</guid><dc:creator><![CDATA[trycatchnix]]></dc:creator><pubDate>Mon, 15 Dec 2014 09:43:48 GMT</pubDate></item></channel></rss>