<?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[Fragen zu new&#x2F;delete und operator&amp;lt;&amp;lt;]]></title><description><![CDATA[<p>Erstmal skizziere ich die Klassen, die ich habe:</p>
<pre><code class="language-cpp">class Punkt{
public:
/*Daten*/
short x,y;
/*Konstruktoren*/
Punkt();
Punkt(short xpos,short ypos);
/*Funktionen*/
bool operator==(Punkt Vergleich);
Punkt operator-();
Punkt operator+(Punkt Summand);
/*usw. usf.
 ...*/
};
</code></pre>
<p>So, mit dieser Klasse sollen also Punktobjekte erzeugt werden können, mit denen gerechnet können werden soll.</p>
<p>Jetzt kommt die eigentliche Problemklasse, die im wesentlichen eine 'Menge von Punkten' verpacken können soll, und mit der dann auch Mengenoperationen möglich sein sollen (Schnittmenge etc.)</p>
<pre><code class="language-cpp">class Punktmenge{
/*Daten*/
Punkt* P; /*Hieraus soll ein dynamisch wachsendes Array aus Punktobjekten
 entstehen können */
unsigned short anzahl; /* Mit dieser Variable soll Buch darüber geführt
 werden, wieviele Punkte momentan im Array P stecken*/
/* Konstruktoren*/
public:
Punktmenge():P(NULL),anzahl(0){}

/* Und jetzt möchte ich den operator&lt;&lt; dergestalt überladen, dass damit
Punktobjekte in die Punktmenge eingefügt werden können */

bool operator&lt;&lt;(Punkt Einschub){
if(!P){ // Fallunterscheidung ob P gleich NULL ist
 P=new Punkt[(anzahl+1)];
 if(P){
  P[0]=Einschub;
  anzahl=1;
  return true;
 }
 else return false;
}
else if(P){ // oder nicht
 Punkt* helper=new Punkt[(anzahl+1)];
 if(helper){
  for(int i=0;i&lt;anzahl;i++)
   helper[i]=P[i];
 helper[anzahl]=Einschub;
 anzahl++;
 delete[] P;
 P=helper;
 return true;
 }
 else return false;
}
return false;
} /* Ende der Funktion operator&lt;&lt; */

/* Restliche Funktionsdeklarationen der Klasse Punktmenge */
};
</code></pre>
<p>Eigentlich arbeitet die Funktion operator&lt;&lt; so, wie ich es mir erhofft hatte,<br />
um in anderen Programmteilen also Anweisungen wie</p>
<pre><code class="language-cpp">Punktmenge M;
M &lt;&lt; Punkt(3,5);
</code></pre>
<p>schreiben zu können.</p>
<p>Ich habe aber gehört, dass Speicherallokationen ziemlich zeitaufwändig sind, und deshalb im Falle, dass beispielsweise mit einer Schleife wie</p>
<pre><code class="language-cpp">Punktmenge M;
for(int i=0;i&lt;=1000;i+=100)
 for(int j=0;j&lt;=1000;j++)
  M &lt;&lt; Punkt(i,j); /* Um die Sinnhaftigkeit dieser Schleife geht es nicht */
</code></pre>
<p>immerhin 10.000 derartige Allokationsanweisungen ausgeführt werden müssten (aufgrund des Operators &lt;&lt;)</p>
<p>Was könnte man unternehmen, um in solchen Fällen nicht 10.000 Allokationsanweisungen zu benötigen? Ist es vernünftiger, zuerst einmal eine 'vermutlich benötigte' Speichermenge zu allokieren, und dann mittels des Operators &lt;&lt; einfach die Punkte nur noch in die Punktmenge hineinzuschreiben - ohne Allokationsanweisungen? Dann kann doch immer noch das Problem auftreten, dass der 'vermutlich benötigte' Speicherbereich trotzdem nicht ausreicht, und man würde womöglich in einen nicht-allokierten Speicherbereich hineinschreiben?</p>
<p>Jedenfalls vorweg einmal danke für Denkanstöße, wie man das Problem außerdem noch angehen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/169233/fragen-zu-new-delete-und-operator-lt-lt</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 16:29:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169233.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 03 Jan 2007 12:45:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fragen zu new&#x2F;delete und operator&amp;lt;&amp;lt; on Wed, 03 Jan 2007 12:46:29 GMT]]></title><description><![CDATA[<p>Erstmal skizziere ich die Klassen, die ich habe:</p>
<pre><code class="language-cpp">class Punkt{
public:
/*Daten*/
short x,y;
/*Konstruktoren*/
Punkt();
Punkt(short xpos,short ypos);
/*Funktionen*/
bool operator==(Punkt Vergleich);
Punkt operator-();
Punkt operator+(Punkt Summand);
/*usw. usf.
 ...*/
};
</code></pre>
<p>So, mit dieser Klasse sollen also Punktobjekte erzeugt werden können, mit denen gerechnet können werden soll.</p>
<p>Jetzt kommt die eigentliche Problemklasse, die im wesentlichen eine 'Menge von Punkten' verpacken können soll, und mit der dann auch Mengenoperationen möglich sein sollen (Schnittmenge etc.)</p>
<pre><code class="language-cpp">class Punktmenge{
/*Daten*/
Punkt* P; /*Hieraus soll ein dynamisch wachsendes Array aus Punktobjekten
 entstehen können */
unsigned short anzahl; /* Mit dieser Variable soll Buch darüber geführt
 werden, wieviele Punkte momentan im Array P stecken*/
/* Konstruktoren*/
public:
Punktmenge():P(NULL),anzahl(0){}

/* Und jetzt möchte ich den operator&lt;&lt; dergestalt überladen, dass damit
Punktobjekte in die Punktmenge eingefügt werden können */

bool operator&lt;&lt;(Punkt Einschub){
if(!P){ // Fallunterscheidung ob P gleich NULL ist
 P=new Punkt[(anzahl+1)];
 if(P){
  P[0]=Einschub;
  anzahl=1;
  return true;
 }
 else return false;
}
else if(P){ // oder nicht
 Punkt* helper=new Punkt[(anzahl+1)];
 if(helper){
  for(int i=0;i&lt;anzahl;i++)
   helper[i]=P[i];
 helper[anzahl]=Einschub;
 anzahl++;
 delete[] P;
 P=helper;
 return true;
 }
 else return false;
}
return false;
} /* Ende der Funktion operator&lt;&lt; */

/* Restliche Funktionsdeklarationen der Klasse Punktmenge */
};
</code></pre>
<p>Eigentlich arbeitet die Funktion operator&lt;&lt; so, wie ich es mir erhofft hatte,<br />
um in anderen Programmteilen also Anweisungen wie</p>
<pre><code class="language-cpp">Punktmenge M;
M &lt;&lt; Punkt(3,5);
</code></pre>
<p>schreiben zu können.</p>
<p>Ich habe aber gehört, dass Speicherallokationen ziemlich zeitaufwändig sind, und deshalb im Falle, dass beispielsweise mit einer Schleife wie</p>
<pre><code class="language-cpp">Punktmenge M;
for(int i=0;i&lt;=1000;i+=100)
 for(int j=0;j&lt;=1000;j++)
  M &lt;&lt; Punkt(i,j); /* Um die Sinnhaftigkeit dieser Schleife geht es nicht */
</code></pre>
<p>immerhin 10.000 derartige Allokationsanweisungen ausgeführt werden müssten (aufgrund des Operators &lt;&lt;)</p>
<p>Was könnte man unternehmen, um in solchen Fällen nicht 10.000 Allokationsanweisungen zu benötigen? Ist es vernünftiger, zuerst einmal eine 'vermutlich benötigte' Speichermenge zu allokieren, und dann mittels des Operators &lt;&lt; einfach die Punkte nur noch in die Punktmenge hineinzuschreiben - ohne Allokationsanweisungen? Dann kann doch immer noch das Problem auftreten, dass der 'vermutlich benötigte' Speicherbereich trotzdem nicht ausreicht, und man würde womöglich in einen nicht-allokierten Speicherbereich hineinschreiben?</p>
<p>Jedenfalls vorweg einmal danke für Denkanstöße, wie man das Problem außerdem noch angehen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201843</guid><dc:creator><![CDATA[Metatron]]></dc:creator><pubDate>Wed, 03 Jan 2007 12:46:29 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu new&#x2F;delete und operator&amp;lt;&amp;lt; on Wed, 03 Jan 2007 12:51:34 GMT]]></title><description><![CDATA[<p>Die beste Lösung wäre es wohl, daß du anstelle der nackten Zeiger einen STL-Container verwendest (z.B. vector&lt;&gt;) - da brauchst du dich nicht mehr um den Speicher zu kümmern (und die STL-Container sind auch so gebaut, daß sie recht vernünftige Laufzeiten liefern).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1201847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1201847</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 03 Jan 2007 12:51:34 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu new&#x2F;delete und operator&amp;lt;&amp;lt; on Thu, 04 Jan 2007 12:31:22 GMT]]></title><description><![CDATA[<p>Eigentlich möchte ich gerne den Umgang mit Zeigern und überladenen Operatoren trainieren, mir ist schon klar, dass es vermutlich vorgefertigte Lösungen gibt.</p>
<p>Was ich gerne eines Tages schreiben können will sind solche Anweisungen:</p>
<pre><code class="language-cpp">Punktmenge A,B;
(A &amp;&amp; B).out(); /* Ausgabefunktion fuer die Schnittmenge */
</code></pre>
<p>Derartige Anweisungen sind mit &lt;vector&gt; Objekten gar nicht möglich.<br />
Es soll also eine Art 'Trainingsübung' sein.<br />
Und natürlich soll auch nicht ein und derselbe Punkt plötzlich doppelt im gleichen Container stecken (das wäre ja unsinnig wenn zwei Exemplare von (1/1) in ein der selben Punktmenge stecken würden).<br />
Mit hoher Wahrscheinlichkeit soll die Punktmengenklasse auch noch als Basisklasse für speziellere Punktmengen zu gebrauchen sein. Mit &lt;vector&gt; klappt das doch auch nicht?<br />
Sorry wenn die Fragen naiv klingen sollten, aber ich bin nicht gerade ein C++ Profi, sondern ziemlicher Anfänger!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202664</guid><dc:creator><![CDATA[Metatron]]></dc:creator><pubDate>Thu, 04 Jan 2007 12:31:22 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu new&#x2F;delete und operator&amp;lt;&amp;lt; on Thu, 04 Jan 2007 12:38:06 GMT]]></title><description><![CDATA[<p>Erstmal ging es nicht darum, anstelle der &quot;Punktmenge&quot; auf vector zu setzen - sondern zur Datenspeicherung IN deiner Klasse einen vector zu verwenden.</p>
<p>Und im Zweifelsfall kannst du dich bei deiner Speicherverwaltung auch an einem vector orientieren - der speichert zusätzlich zur aktuellen Größe auch eine Kapazität (die gibt an, wieviel Speicher er tatsächlich verwendet) und verdoppelt seinen Speicher, wenn die Kapazität überschritten wird - auf die Weise wird er zwar auch gelegentlich seinen Inhalt umkopieren müssen, aber nicht bei jeder push_back()-Anweisung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1202671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1202671</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 04 Jan 2007 12:38:06 GMT</pubDate></item></channel></rss>