<?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]]></title><description><![CDATA[<p>Guten Tag zusammen,</p>
<p>ich habe ein Tamplate programmiert.<br />
Ich rufe eine Funktion auf, die eine Instanz der Klasse übergeben bekommt, z.B. m_equal.<br />
Wenn die Funktion ausgeführt wurde, wird der Destruktor der übergebenen Instanz aufgerufen.<br />
Warum ruft der den Destructor auf und zerstört damit das Array der anderen Instanz? Wie kann ich das verhindern? Ich will das Array erhalten.</p>
<p>Der Rest soll so sein wie er ist.</p>
<p>Vielen Dank für die Hilfe.</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class C_Matrix
{
private:
	T		*m_array;
	int		m_r;
	int		m_c;
	int		m_elements;

public:
			C_Matrix(int r, int c);
			~C_Matrix();
	int		m_getRow();
	int		m_getColumn();
	void	m_getElement();
	void	m_setElement();
	void	m_transpose();
	void	m_equal(C_Matrix dummy);
	void	m_add(C_Matrix dummy);
	void	m_sub(C_Matrix dummy);
	void	m_skalar();
	void	m_neg();
	void	m_multi(C_Matrix dummy);
	friend	ostream&amp; operator&lt;&lt; &lt;&gt; (ostream&amp; os, C_Matrix&lt;T&gt;&amp; dummy);
	friend	istream&amp; operator&gt;&gt; &lt;&gt; (istream&amp; is, C_Matrix&lt;T&gt;&amp; dummy);
};
</code></pre>
<p>Konstruktor/Destruktor</p>
<pre><code class="language-cpp">template &lt;class T&gt;
C_Matrix&lt;T&gt;::C_Matrix(int r, int c)
{
	int g;

	g = (r * c);

	m_array = NULL;
	m_array = new T[g];

	if (m_array == NULL)
		throw &quot;Fehler beim Erzeugen des Arrays&quot;;

	for(int i = 0; i &lt; g; i++)
	{
		m_array[i] = 0;
	}

	m_r = r;
	m_c = c;
	m_elements = r*c;
}

template &lt;class T&gt;
C_Matrix&lt;T&gt;::~C_Matrix()
{
	delete[] m_array;
	m_array = NULL;
}
</code></pre>
<p>m_equal</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void C_Matrix&lt;T&gt;::m_equal(C_Matrix dummy)
{
	int i = 0;
	int j = 0;
	int z;

	if (m_r == dummy.m_r &amp;&amp; m_c == dummy.m_c)
	{
		do
		{
			do
			{
				z = j + m_c*i;
				if (m_array[z] != dummy.m_array[z])
				{
					cout &lt;&lt; &quot;Die &quot; &lt;&lt; i+1 &lt;&lt; &quot;,&quot; &lt;&lt; j+1 &lt;&lt; &quot; Elemente sind unterschiedlich!&quot; &lt;&lt; endl;
					cout &lt;&lt;  &quot;Die Matrizen sind nicht gleich.\n&quot;;
					break;
				}
				if (m_array[z] != dummy.m_array[z])
					break;
				j++;
			}while(j &lt; m_c);
			if (m_array[z] != dummy.m_array[z])
				break;
			i++;
		}while (i &lt; m_r);
		if (m_array[z] == dummy.m_array[z])
		cout &lt;&lt; &quot;Die Matrizen sind gleich!\n&quot;;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/244699/destruktor</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 04:53:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244699.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 04 Jul 2009 10:23:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destruktor on Sat, 04 Jul 2009 10:23:19 GMT]]></title><description><![CDATA[<p>Guten Tag zusammen,</p>
<p>ich habe ein Tamplate programmiert.<br />
Ich rufe eine Funktion auf, die eine Instanz der Klasse übergeben bekommt, z.B. m_equal.<br />
Wenn die Funktion ausgeführt wurde, wird der Destruktor der übergebenen Instanz aufgerufen.<br />
Warum ruft der den Destructor auf und zerstört damit das Array der anderen Instanz? Wie kann ich das verhindern? Ich will das Array erhalten.</p>
<p>Der Rest soll so sein wie er ist.</p>
<p>Vielen Dank für die Hilfe.</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class C_Matrix
{
private:
	T		*m_array;
	int		m_r;
	int		m_c;
	int		m_elements;

public:
			C_Matrix(int r, int c);
			~C_Matrix();
	int		m_getRow();
	int		m_getColumn();
	void	m_getElement();
	void	m_setElement();
	void	m_transpose();
	void	m_equal(C_Matrix dummy);
	void	m_add(C_Matrix dummy);
	void	m_sub(C_Matrix dummy);
	void	m_skalar();
	void	m_neg();
	void	m_multi(C_Matrix dummy);
	friend	ostream&amp; operator&lt;&lt; &lt;&gt; (ostream&amp; os, C_Matrix&lt;T&gt;&amp; dummy);
	friend	istream&amp; operator&gt;&gt; &lt;&gt; (istream&amp; is, C_Matrix&lt;T&gt;&amp; dummy);
};
</code></pre>
<p>Konstruktor/Destruktor</p>
<pre><code class="language-cpp">template &lt;class T&gt;
C_Matrix&lt;T&gt;::C_Matrix(int r, int c)
{
	int g;

	g = (r * c);

	m_array = NULL;
	m_array = new T[g];

	if (m_array == NULL)
		throw &quot;Fehler beim Erzeugen des Arrays&quot;;

	for(int i = 0; i &lt; g; i++)
	{
		m_array[i] = 0;
	}

	m_r = r;
	m_c = c;
	m_elements = r*c;
}

template &lt;class T&gt;
C_Matrix&lt;T&gt;::~C_Matrix()
{
	delete[] m_array;
	m_array = NULL;
}
</code></pre>
<p>m_equal</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void C_Matrix&lt;T&gt;::m_equal(C_Matrix dummy)
{
	int i = 0;
	int j = 0;
	int z;

	if (m_r == dummy.m_r &amp;&amp; m_c == dummy.m_c)
	{
		do
		{
			do
			{
				z = j + m_c*i;
				if (m_array[z] != dummy.m_array[z])
				{
					cout &lt;&lt; &quot;Die &quot; &lt;&lt; i+1 &lt;&lt; &quot;,&quot; &lt;&lt; j+1 &lt;&lt; &quot; Elemente sind unterschiedlich!&quot; &lt;&lt; endl;
					cout &lt;&lt;  &quot;Die Matrizen sind nicht gleich.\n&quot;;
					break;
				}
				if (m_array[z] != dummy.m_array[z])
					break;
				j++;
			}while(j &lt; m_c);
			if (m_array[z] != dummy.m_array[z])
				break;
			i++;
		}while (i &lt; m_r);
		if (m_array[z] == dummy.m_array[z])
		cout &lt;&lt; &quot;Die Matrizen sind gleich!\n&quot;;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1736994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1736994</guid><dc:creator><![CDATA[Seaman]]></dc:creator><pubDate>Sat, 04 Jul 2009 10:23:19 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor on Sat, 04 Jul 2009 10:37:38 GMT]]></title><description><![CDATA[<p>Es fehlt der Kopierkonstruktor (und der Zuweisungsoperator). Die müssen natürlich eigenen Speichern anfordern und nicht nur der Zeiger auf das Array eines anderen Objektes übernehmen. Außerdem sollten Objekte per Referenz übergeben werden (das würde das Problem in diesem Fall auch umgehen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1737000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1737000</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 04 Jul 2009 10:37:38 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor on Sat, 04 Jul 2009 10:43:40 GMT]]></title><description><![CDATA[<p>Der Autor dieser Nachricht hat Probleme in Deinem Code identifiziert,<br />
möchte sich aber durch dieses Antwortmuster Zeit sparen. Die für Dich<br />
zutreffenden Tipps sind angekreuzt:<br />
<div class="plugin-markdown"><input type="checkbox" id="checkbox269435" checked="true" /><label for="checkbox269435">Schaff Dir ein gutes C++ Buch an und lerne die Basics.</label></div><br />
<div class="plugin-markdown"><input type="checkbox" id="checkbox269434" checked="true" /><label for="checkbox269434">Nutze Kapselung und RAII.</label></div><br />
<div class="plugin-markdown"><input type="checkbox" id="checkbox269433" checked="true" /><label for="checkbox269433">Beherzige die Dreierregel.</label></div><br />
<div class="plugin-markdown"><input type="checkbox" id="checkbox269432" checked="true" /><label for="checkbox269432">Verwende hier doch einfach stattdessen einen std::vector&lt;&gt;.</label></div><br />
<div class="plugin-markdown"><input type="checkbox" id="checkbox269431" checked="true" /><label for="checkbox269431">Sonstiges (siehe unten)</label></div></p>
<p>C++ behandelt Typen wie &quot;int&quot; und einen Klassentyp gleich (konsistent).<br />
Im Gegensatz dazu bieten andere Sprachen wie Java und D &quot;Referenzsemantik&quot;<br />
für Klassentypen.</p>
<pre><code class="language-java">MeineMatrix m = new MeineMatrix();  
  MeineMatrix k = m;
  // m und k sind Referenzen,
  // die auf dasselbe Objekt zeigen
</code></pre>
<pre><code class="language-cpp">MeineMatrix m (3,3);
  MeineMatrix k = m;
  // m und k sind zwei MeineMatrix-Objekte.  
  // k ist eine Kopie von m.
</code></pre>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1737001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1737001</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sat, 04 Jul 2009 10:43:40 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor on Sat, 04 Jul 2009 11:03:42 GMT]]></title><description><![CDATA[<p>der fehler liegt - wie schon gesagt - daran, dass du keinen op= und copy ctor hast - nun aber ein paar sätze zu deinem code an sich:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class C_Matrix
{
private:
	T		*m_array;
	int		m_r;
	int		m_c;
	int		m_elements;
</code></pre>
<p>m_r und m_c sind ein wenig komische bezeichner, meinst du nicht auch, ein paar mehr zeichen würden nicht schaden?!</p>
<pre><code class="language-cpp">public:
			C_Matrix(int r, int c);
</code></pre>
<p>ich als nutzer wäre hier auch wieder ein wenig über r und c verwundert - würde zwar iwann mitbekommen, wofür es steht, aber auch hier wärs kein fehler bezeichner auszuschreiben...</p>
<pre><code class="language-cpp">~C_Matrix();
	int		m_getRow();
	int		m_getColumn();
</code></pre>
<p>Getter sollten const sein (siehe &quot;const correctness&quot;)</p>
<pre><code class="language-cpp">void	m_getElement();
	void	m_setElement();
	void	m_transpose();
</code></pre>
<p>wieso stellst du denn allen fkt ein m_ vor? hast du das schon mal irgendwo anders gesehen? ich kenn es nur bei member-variablen - und dort mag ich es zwar nicht, aber es gibt leute, die das bevorzugen...</p>
<pre><code class="language-cpp">void	m_equal(C_Matrix dummy);
	void	m_add(C_Matrix dummy);
	void	m_sub(C_Matrix dummy);
	void	m_skalar();
	void	m_neg();
	void	m_multi(C_Matrix dummy);
</code></pre>
<p>dafür gibt es operatoren<br />
siehe auch die artikel von pumuckl:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html</a><br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-240706.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-240706.html</a><br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-242944.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-242944.html</a></p>
<pre><code class="language-cpp">friend	ostream&amp; operator&lt;&lt; &lt;&gt; (ostream&amp; os, C_Matrix&lt;T&gt;&amp; dummy);
	friend	istream&amp; operator&gt;&gt; &lt;&gt; (istream&amp; is, C_Matrix&lt;T&gt;&amp; dummy);
};
</code></pre>
<p>1. weiß ich nicht, was du mit dem &lt;&gt; willst<br />
2. brauchst du - da du es als friend in der klassendefinition geschrieben hast - nicht C_Matrix&lt;T&gt; sondern nur C_Matrix zu schreiben<br />
3. außerdem hast du auch hier wieder nicht gekennzeichnet, dass die reference const ist - also beim op&lt;&lt;. siehe wieder const correctness<br />
4. hast du wahrscheinlich ein <code>using namespace std;</code> im header - sollte man nicht tun!</p>
<p>Konstruktor/Destruktor</p>
<pre><code class="language-cpp">template &lt;class T&gt;
C_Matrix&lt;T&gt;::C_Matrix(int r, int c)
{
	int g;

	g = (r * c);
</code></pre>
<p>g ist wieder nen doofer bezeichner, zweitens würde es auch ein<br />
<code>int g = r*c;</code> und du hättest statt 3 zeilen eine</p>
<pre><code class="language-cpp">m_array = NULL;
	m_array = new T[g];
</code></pre>
<p>die erste zeile is sinnlos...</p>
<pre><code class="language-cpp">if (m_array == NULL)
		throw &quot;Fehler beim Erzeugen des Arrays&quot;;
</code></pre>
<p>1. sollte man auch die exception-klassen nutzen, wenn man fehler wirft und nciht einfach mit pointern um sich schmeißen...<br />
2. wird das niemals geworfen!<br />
new/new[] gibt entweder eine (gültige) adresse wieder oder wirft selbst ne exception(std::bad_alloc) - es gibt dann noch nen nothrow-new - wüsste aber nicht, welche vorteile das haben sollte...</p>
<pre><code class="language-cpp">for(int i = 0; i &lt; g; i++)
	{
		m_array[i] = 0;
	}
</code></pre>
<p>ist ok</p>
<pre><code class="language-cpp">m_r = r;
	m_c = c;
	m_elements = r*c;
}
</code></pre>
<p>für so etwas nutzt man idR die Initialisierungsliste</p>
<pre><code class="language-cpp">template &lt;class T&gt;
C_Matrix&lt;T&gt;::~C_Matrix()
{
	delete[] m_array;
	m_array = NULL;
}
</code></pre>
<p>wieso genau setzt du m_array noch mal auf 0 - das objekt ist hier schon nicht mehr gültig - ist also einfach nur sinnlos ^^</p>
<p>m_equal</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void C_Matrix&lt;T&gt;::m_equal(C_Matrix dummy)
</code></pre>
<p>wieso dummy? normalerweise nimmt man so etwas wie rhs oder other - aber dummy ist ja gerad nen name, der extrem verwirrt...</p>
<pre><code class="language-cpp">{
	int i = 0;
	int j = 0;
	int z;

	if (m_r == dummy.m_r &amp;&amp; m_c == dummy.m_c)
	{
		do
		{
			do
			{
				z = j + m_c*i;
				if (m_array[z] != dummy.m_array[z])
				{
					cout &lt;&lt; &quot;Die &quot; &lt;&lt; i+1 &lt;&lt; &quot;,&quot; &lt;&lt; j+1 &lt;&lt; &quot; Elemente sind unterschiedlich!&quot; &lt;&lt; endl;
					cout &lt;&lt;  &quot;Die Matrizen sind nicht gleich.\n&quot;;
					break;
				}
				if (m_array[z] != dummy.m_array[z])
					break;
				j++;
			}while(j &lt; m_c);
			if (m_array[z] != dummy.m_array[z])
				break;
			i++;
		}while (i &lt; m_r);
		if (m_array[z] == dummy.m_array[z])
		cout &lt;&lt; &quot;Die Matrizen sind gleich!\n&quot;;
	}
}
</code></pre>
<p>sry, aber das is mir zu grässlich -.-<br />
außerdem sollte man niemals die ausgabe mit in fkt schmeißen, wo sie unintuitiv ist...<br />
wenn du schon die genaue position wissen willst, an der die elemente unterschiedlich sind, gib halt nen zahlenpaar(die koordinaten) zurück...<br />
dann kann der aufrufer selbst entscheiden, was er ausgibt und was nicht...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1737007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1737007</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 04 Jul 2009 11:03:42 GMT</pubDate></item></channel></rss>