<?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[istream rekursiv aufrufen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin noch ziemlich neu in C++ und hab ein Problem:</p>
<p>Ich soll über cin mehrere Objekte(Punkt, Polygon und Gruppe) einlesen, wobei diese dann natürlich auch erst angelegt werden sollen. Punkt und Polygon haben eine eigene überladung des istream.</p>
<p>Gruppe auch, aber hier komm ich nicht weiter:<br />
Eine Gruppe kann mehrere Objekte beinhalten(auch wieder Gruppen)<br />
Daher wollte ich versuchen in der istream-Methode je nach eingelesenem Objekt wieder die istream Methode aufzurufen, nur leider weiß ich nicht wie.</p>
<p>Hier mal mein Code:</p>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;(istream&amp; is, GeoGroup&amp; g)
{
	// Eingabe in der Form: 
	// GeoGroup ID: nGG  Objekte: 
	// &lt;
	// GeoPoint ID: pointtemp  Geometrie: (6,6)
	// GeoGroup ID: mGG  Objekte: 
	// &lt;
	// GeoPoint ID: hPoi  Geometrie: (8,10)
	// GeoPolygon ID: jPol  Geometrie: {(-1,8)(0,10)(-4,11)(3,6)(-1,8)}
	// &gt;
	// GeoPolygon ID: polygontemp  Geometrie: {(4,6)(3,4)(2,5)(4,6)}
	// &gt;

	string id;
	string nix;
	string zeile;
	string objekt;

	is.ignore(13);
	// Extrahieren der ID
	getline(is, id, ' ');
	// Setzen der eingelesenen ID
	g.setID(id.c_str());
	// Bis zum Ende der Zeile lesen
	getline(is, nix, '\n');
	// Die öffnende spitze Klammer einer Geogroup überlesen
	getline(is, nix, '\n');
	// Solange weiterlesen bis eine schließende spitze Klammer auftaucht
	while(is.peek() != '&gt;')
	{
	  // Auslesen der Objektbezeichnung
	  getline(is, zeile, '\n');
	  // Prüfen ob GeoPoint
	  if(!zeile.find(&quot;GeoPoint&quot;))
	  {
		  GeoPoint temp(&quot;0&quot;);
		  is &gt;&gt; temp;
		  cout &lt;&lt; &quot;Punkt&quot; &lt;&lt; endl;
	  }
	  // Prüfen ob GeoPolygon
	  if(!zeile.find(&quot;GeoPolygon&quot;))
		  cout &lt;&lt; &quot;Polygon&quot; &lt;&lt; endl;
	  // Prüfen auf GeoGroup
	  if(!zeile.find(&quot;GeoGroup&quot;))
		  cout &lt;&lt; &quot;Gruppe&quot; &lt;&lt; endl;
	}

	return is;
}
</code></pre>
<p>Das Problem taucht in der While-Schleife auf, wo ich versuche die zeile über den istream in temp einzulesen.</p>
<p>Kann mir jemand helfen? Ist sowas überhaupt möglich?</p>
<p>Hoffe man konnte mein Problem verstehen</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/168304/istream-rekursiv-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 08:37:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/168304.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 20 Dec 2006 17:02:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to istream rekursiv aufrufen on Wed, 20 Dec 2006 17:02:24 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin noch ziemlich neu in C++ und hab ein Problem:</p>
<p>Ich soll über cin mehrere Objekte(Punkt, Polygon und Gruppe) einlesen, wobei diese dann natürlich auch erst angelegt werden sollen. Punkt und Polygon haben eine eigene überladung des istream.</p>
<p>Gruppe auch, aber hier komm ich nicht weiter:<br />
Eine Gruppe kann mehrere Objekte beinhalten(auch wieder Gruppen)<br />
Daher wollte ich versuchen in der istream-Methode je nach eingelesenem Objekt wieder die istream Methode aufzurufen, nur leider weiß ich nicht wie.</p>
<p>Hier mal mein Code:</p>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;(istream&amp; is, GeoGroup&amp; g)
{
	// Eingabe in der Form: 
	// GeoGroup ID: nGG  Objekte: 
	// &lt;
	// GeoPoint ID: pointtemp  Geometrie: (6,6)
	// GeoGroup ID: mGG  Objekte: 
	// &lt;
	// GeoPoint ID: hPoi  Geometrie: (8,10)
	// GeoPolygon ID: jPol  Geometrie: {(-1,8)(0,10)(-4,11)(3,6)(-1,8)}
	// &gt;
	// GeoPolygon ID: polygontemp  Geometrie: {(4,6)(3,4)(2,5)(4,6)}
	// &gt;

	string id;
	string nix;
	string zeile;
	string objekt;

	is.ignore(13);
	// Extrahieren der ID
	getline(is, id, ' ');
	// Setzen der eingelesenen ID
	g.setID(id.c_str());
	// Bis zum Ende der Zeile lesen
	getline(is, nix, '\n');
	// Die öffnende spitze Klammer einer Geogroup überlesen
	getline(is, nix, '\n');
	// Solange weiterlesen bis eine schließende spitze Klammer auftaucht
	while(is.peek() != '&gt;')
	{
	  // Auslesen der Objektbezeichnung
	  getline(is, zeile, '\n');
	  // Prüfen ob GeoPoint
	  if(!zeile.find(&quot;GeoPoint&quot;))
	  {
		  GeoPoint temp(&quot;0&quot;);
		  is &gt;&gt; temp;
		  cout &lt;&lt; &quot;Punkt&quot; &lt;&lt; endl;
	  }
	  // Prüfen ob GeoPolygon
	  if(!zeile.find(&quot;GeoPolygon&quot;))
		  cout &lt;&lt; &quot;Polygon&quot; &lt;&lt; endl;
	  // Prüfen auf GeoGroup
	  if(!zeile.find(&quot;GeoGroup&quot;))
		  cout &lt;&lt; &quot;Gruppe&quot; &lt;&lt; endl;
	}

	return is;
}
</code></pre>
<p>Das Problem taucht in der While-Schleife auf, wo ich versuche die zeile über den istream in temp einzulesen.</p>
<p>Kann mir jemand helfen? Ist sowas überhaupt möglich?</p>
<p>Hoffe man konnte mein Problem verstehen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195526</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 20 Dec 2006 17:02:24 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Wed, 20 Dec 2006 17:50:20 GMT]]></title><description><![CDATA[<p>Gloem schrieb:</p>
<blockquote>
<p>Kann mir jemand helfen?</p>
</blockquote>
<p>Mit Sicherheit.</p>
<p>Gloem schrieb:</p>
<blockquote>
<p>Ist sowas überhaupt möglich?</p>
</blockquote>
<p>Bestimmt.</p>
<p>Gloem schrieb:</p>
<blockquote>
<p>Hoffe man konnte mein Problem verstehen</p>
</blockquote>
<p>Nein, kann man nicht. Du hast dein Problem nämlich gar nicht geschildert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195559</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Wed, 20 Dec 2006 17:50:20 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Wed, 20 Dec 2006 22:00:10 GMT]]></title><description><![CDATA[<p>Dann versuch ich es nochmal:</p>
<p>der obige Code ist die Überladung des istream &gt;&gt; Operators in der Klasse GeoGroup.</p>
<p>Die Klasse GeoGroup hat ein vector-Objekt in dem Geopoints, GeoPolygone und auch GeoGroups selber wieder enthalten sein können. Möchte ich nun ein GeoGroup-Element über cin einlesen wird die obige Methode aufgerufen.</p>
<p>Wenn aber in dieser GeoGroup wieder andere Objekte(z.B. ein GeoPoint) enthalten sind, möchte ich aus der obigen Funktion heraus die istream-Methode des GeoPoints aufrufen. <strong>Und genau hieran scheiter ich momentan</strong>.<br />
Mit cin &gt;&gt; point kann ich ein GeoPoint einlesen(wenn point ein GeoPoint-Objekt ist) und mit cin &gt;&gt; polygon ein GeoPolygon</p>
<p>Als Code nochmal</p>
<pre><code class="language-cpp">// Hier prüfe ich, das die eingelesene Zeile einen GeoPoint enthält
if(!zeile.find(&quot;GeoPoint&quot;))
      {
          // Anlegen eines Geopoint-Objektes
          GeoPoint temp(&quot;0&quot;);

          // PROBLEM: Hier soll nun die Zeile die den GeoPoint enthält mit dem istream des GeoPoints eingelesen werden nur weiß ich nicht wie
          is &gt;&gt; temp; // Funktioniert nicht
          // im Hauptprogramm wäre der Aufruf hier cin &gt;&gt; temp (aber cin hab ich ja schon als string Zeile eingelesen)

          //Geometrie zur GeoGroup hinzufügen
          this.addGeom(temp);
      }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1195759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195759</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 20 Dec 2006 22:00:10 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 05:39:21 GMT]]></title><description><![CDATA[<p>Geht's ein wenig präziser als &quot;funktioniert nicht&quot;? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1195806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195806</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Thu, 21 Dec 2006 05:39:21 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 07:06:18 GMT]]></title><description><![CDATA[<p>Verstehe ich das richtig? Die Daten deines GeoPoint-Objekts hast du schon mit dem getline()-Aufruf eingelesen und wunderst dich nun, daß sie nicht mehr im istream stehen. Da heißt die Lösung (vermutlich) stringstream.</p>
<p>(btw, was soll die Bedingung <code>if(!zeile.find(&quot;GeoPoint&quot;))...</code> eigentlich bedeuten? find() liefert keinen Boolean zurück, sondern die Position, an der der Teilstring gefunden wurde.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195812</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 21 Dec 2006 07:06:18 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 08:13:34 GMT]]></title><description><![CDATA[<blockquote>
<p>(btw, was soll die Bedingung if(!zeile.find(&quot;GeoPoint&quot;))... eigentlich bedeuten? find() liefert keinen Boolean zurück, sondern die Position, an der der Teilstring gefunden wurde.)</p>
</blockquote>
<p>Der Compiler sieht aber 0 als wahr und ungleich 0 als false an. Auf jedenfall funktioniert das und im Falle eines Punktes komm ich auch in den angegebenen Teil.</p>
<p>Ich versuch jetzt nochmal mein Problem zu erklären:</p>
<p>Ich habe eine Klasse GeoShape von der die Klassen GeoPoint, GeoPolygon und GeoGroup erben. Ein Geopoint ist nur ein Punkt, ein GeoPolygon ist ein Polygon und eine GeoGoup ist eine Sammlung von Punkten, Polygonen oder wieder Gruppen.</p>
<p>Der Benutzer soll nun über die Kommandozeileneingabe eine Geometrie eingeben können, wofür in jeder Klasse der globale istream überladen wurde</p>
<p>Wenn ich z.B. einen Punkt von der Kommandozeile einlesen will, muss der Benutzer den nach diesem Schema eingeben:</p>
<pre><code>GeoPoint ID: pointtemp  Geometrie: (6,6)
</code></pre>
<p>mit GeoPoint p();<br />
cin &gt;&gt; p;<br />
wird er dann eingelesen</p>
<p>Wenn ich ein Polygon von der Kommandozeile einlesen will, muss der Benutzer den nach diesem Schema eingeben:</p>
<pre><code>GeoPolygon ID: jPol  Geometrie: {(-1,8)(0,10)(-4,11)(3,6)(-1,8)}
</code></pre>
<p>wieder mit GeoPolygon poly();<br />
cin &gt;&gt; poly;</p>
<p>Diese beiden Fälle funktionieren ohne Probleme</p>
<p><strong>Das Problem ist nun die GeoGruppe</strong><br />
**Ich möchte hier in der Überladung des istreams der GeoGroup die istreams der anderen Klassen aufrufen.<br />
**</p>
<p>Der Benutzer gibt die GeoGroup dann so ein:</p>
<pre><code>GeoGroup ID: nGG  Objekte: 
&lt;
GeoPoint ID: pointtemp  Geometrie: (6,6)
GeoGroup ID: mGG  Objekte: 
&lt;
GeoPoint ID: hPoi  Geometrie: (8,10)
GeoPolygon ID: jPol  Geometrie: {(-1,8)(0,10)(-4,11)(3,6)(-1,8)}
&gt;
GeoPolygon ID: polygontemp  Geometrie: {(4,6)(3,4)(2,5)(4,6)}
&gt;
</code></pre>
<p>Code aus der Überladung des istreams der GeoGroup</p>
<pre><code class="language-cpp">// Sollange keine spitze schließende Klammer an Ende einer GeoGroup kommt
while(is.peek() != '&gt;')
    {
      // Auslesen der Objektbezeichnung
      getline(is, zeile, '\n');

      // Prüfen ob GeoPoint Ojekt eingelesen wurde
      if(!zeile.find(&quot;GeoPoint&quot;))
      {
Hier soll nun der Aufruf des überladenen istream operators des GeoPoints kommen
          cout &lt;&lt; &quot;Punkt&quot; &lt;&lt; endl;
      }
      // Prüfen ob GeoPolygon
      if(!zeile.find(&quot;GeoPolygon&quot;))
Hier soll nun der Aufruf des überladenen istream operators des GeoPolygons kommen
          cout &lt;&lt; &quot;Polygon&quot; &lt;&lt; endl;
      // Prüfen auf GeoGroup
      if(!zeile.find(&quot;GeoGroup&quot;))
Hier soll nun der Aufruf des überladenen istream operators der GeoGroup kommen
          cout &lt;&lt; &quot;Gruppe&quot; &lt;&lt; endl;
    }
</code></pre>
<blockquote>
<p>Geht's ein wenig präziser als &quot;funktioniert nicht&quot;?</p>
</blockquote>
<p>Leider kann ich es nicht genauer schreiben, da ich nicht weiß wie der Code auszusehen hat und ob ein Aufruf des istream operators&gt;&gt; im Quellcode ohne Kommandozeile überhaupt möglich ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195848</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 21 Dec 2006 08:13:34 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 08:23:47 GMT]]></title><description><![CDATA[<p>Gloem schrieb:</p>
<blockquote>
<blockquote>
<p>(btw, was soll die Bedingung if(!zeile.find(&quot;GeoPoint&quot;))... eigentlich bedeuten? find() liefert keinen Boolean zurück, sondern die Position, an der der Teilstring gefunden wurde.)</p>
</blockquote>
<p>Der Compiler sieht aber 0 als wahr und ungleich 0 als false an.</p>
</blockquote>
<p>Andersum.</p>
<blockquote>
<p>Auf jedenfall funktioniert das und im Falle eines Punktes komm ich auch in den angegebenen Teil.</p>
</blockquote>
<p>Du suchst nicht, sondern prüfst nur, ob zeile mit dem gesuchten String anfängt. Nur dann liefert dir find nämlich 0 zurück.</p>
<blockquote>
<blockquote>
<p>Geht's ein wenig präziser als &quot;funktioniert nicht&quot;?</p>
</blockquote>
<p>Leider kann ich es nicht genauer schreiben, da ich nicht weiß wie der Code auszusehen hat und ob ein Aufruf des istream operators&gt;&gt; im Quellcode ohne Kommandozeile überhaupt möglich ist.</p>
</blockquote>
<p>Klar ist das möglich. Aber du musst den Fehler besser beschreiben. Mit &quot;funktioniert nicht&quot; kann niemand etwas anfangen.</p>
<p>Was ist das beobachtete Verhalten <em>genau</em>? Fehlermeldung, falsche Werte, Absturz usw. Irgendwie glaube ich nicht, dass da nur eine Meldung &quot;Funktioniert nicht&quot; auf dem Bildschirm erscheint.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195855</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Thu, 21 Dec 2006 08:23:47 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 08:35:32 GMT]]></title><description><![CDATA[<p>Du hast per getline() die komplette Zeile eingelesen, in der die Beschreibung des GeoPoint steht - das heißt, dein Lesezeiger steht nun am Anfang von Zeile 4 und der GeoPoint::operator&gt;&gt; versucht, diese Zeile als Punkt zu lesen, was vermutlich schiefgeht. Die Lösung sieht etwa so aus:</p>
<pre><code class="language-cpp">GeoPoint p;
istringstream l(zeile);
l&gt;&gt;p;
...
</code></pre>
<p>(nur bei der mehrzeiligen Darstellung einer GeoGroup könnte es da ein Problem geben - weil du dort die erste Zeile in der Hand und den Rest der Daten im Stream hast. Als Lösungsansatz könntest du deren operator&gt;&gt; so anpassen, daß er auch Eingaben akzeptiert, die mit &quot;&gt;&quot; beginnen (da mußt du die Gruppen-ID nachträglich ergänzen).)</p>
<p>PS: Eine Alternative Lösung wäre es, GeoShape eine read-Methode zu geben:</p>
<pre><code class="language-cpp">void read(string first_line,istream&amp; input)
{
  if(first_line==&quot;&quot;) getline(input,first_line);
  ...
}

istream&amp; operator&gt;&gt;(istream&amp; input,Geoshape&amp;data)
{
  data.read(&quot;&quot;,input);
  return input;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1195864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195864</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 21 Dec 2006 08:35:32 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 09:05:36 GMT]]></title><description><![CDATA[<p>cool, danke.</p>
<p>Das erste funktioniert schonmal, jetzt muss ich nur noch an die GeoGroup machen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195884</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 21 Dec 2006 09:05:36 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 09:25:46 GMT]]></title><description><![CDATA[<p>Ok, es funktioniert doch nicht, er wirft mich dann bei der Ausgabe raus wenn ich versuche mittels dynamic_cast mein Objekt aus dem Vektor wieder herauszubekommen</p>
<pre><code class="language-cpp">GeoPoint *pGeoPoint = dynamic_cast&lt;GeoPoint*&gt;(*first);
</code></pre>
<p>Dann eben doch die zweite wahrscheinlich auch bessere Variante:</p>
<p>Aber wofür brauch ich in der read-Methode den String? Geht das nicht auch ohne?</p>
<p>GeoGroup.h</p>
<pre><code class="language-cpp">class GeoGroup : public GeoShape
{
public:
	...

	void read(istream&amp; input);

	...
};
</code></pre>
<p>GeoGroup.cpp</p>
<pre><code class="language-cpp">void GeoGroup::read(istream&amp; input)
{
	// Hier den ganzen Rotz aus der alten istream-Methode
        if(!zeile.find(&quot;GeoGroup&quot;))
		  read(is);
}

// Überladen des globalen Output-Streams für die Eingabe einer GeoGroup
istream&amp; operator&gt;&gt;(istream&amp; is, GeoGroup&amp; g)
{
	g.read(is);

	return is;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1195902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195902</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 21 Dec 2006 09:25:46 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 09:38:10 GMT]]></title><description><![CDATA[<p>Gloem schrieb:</p>
<blockquote>
<p>Ok, es funktioniert doch nicht, er wirft mich dann bei der Ausgabe raus wenn ich versuche mittels dynamic_cast mein Objekt aus dem Vektor wieder herauszubekommen</p>
<pre><code class="language-cpp">GeoPoint *pGeoPoint = dynamic_cast&lt;GeoPoint*&gt;(*first);
</code></pre>
</blockquote>
<p>Mit was für einer Meldung wirft er dich heraus? Und was genau steht in first? Und wie wird es gefüllt?</p>
<blockquote>
<p>Dann eben doch die zweite wahrscheinlich auch bessere Variante:</p>
<p>Aber wofür brauch ich in der read-Methode den String? Geht das nicht auch ohne?</p>
</blockquote>
<p>Damit wollte ich das Problem aushebeln, daß du möglicherweise den ersten Teil deines Objekts schon ausgelesen hast, wenn du den Stream weitergibst (IOStream's bieten zwar die Möglichkeit, eingelesene Zeichen zurückzuschreiben, aber der Standard garantiert nicht, daß das bei so langen Folgen fehlerfrei funktioniert). Die GeoGroup::read()-Methode kann damit die bereits eingelesene Zeile des Sub-Objekts an dessen read()-Methode weitergeben:</p>
<pre><code class="language-cpp">if(zeile.find(&quot;GeoPoint&quot;)==0)
{
  GeoPoint p;
  p.read(zeile,input);
  ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1195912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195912</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 21 Dec 2006 09:38:10 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 09:54:13 GMT]]></title><description><![CDATA[<p>Klar, an das mit dem String hätte ich auch denken können.</p>
<p>Der Fehler sieht so aus:<br />
PopUp mit Unhandled exception at 0x7c812a5b in Pflichtblatt2.exe: Microsoft C++ exception: std::__non_rtti_object at memory location 0x0013f9ac..</p>
<p>Auftreten passiert während des cout &lt;&lt; GeoGroup Aufrufs<br />
Das liegte daran, das er die Geometrien nicht korrekt in den Vector speichert.</p>
<p>Mein Vector sieht so aus:</p>
<pre><code class="language-cpp">typedef vector&lt;GeoShape*&gt; Geovektor;
</code></pre>
<p>sprich er legt die Objekte Polymorph zur abstrakten Oberklasse GeoShape ab</p>
<p>Eingefügt werden die mit dieser Methode:</p>
<pre><code class="language-cpp">// Methode um GeoObjekte zur GeoGroup hinzuzufügen
void GeoGroup::addGeoObject(GeoShape* geo)
{
		itsgeos.push_back(geo);
}
</code></pre>
<p>aus der Mainmethoder heraus funktioniert auch super, nur aus der neuen read-Methode nicht, da ich es nicht hinbekomme, einen GeoShape zu erzeugen</p>
<pre><code class="language-cpp">if(!zeile.find(&quot;GeoPoint&quot;))
		{
			GeoPoint temp(&quot;0&quot;);
			istringstream l(zeile);
			l &gt;&gt; temp;
			this-&gt;addGeoObject(&amp;temp);
		}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1195928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195928</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 21 Dec 2006 09:54:13 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 09:58:02 GMT]]></title><description><![CDATA[<p>Gloem schrieb:</p>
<blockquote>
<p>aus der Mainmethoder heraus funktioniert auch super, nur aus der neuen read-Methode nicht, da ich es nicht hinbekomme, einen GeoShape zu erzeugen</p>
</blockquote>
<p>Du erzeugst das Objekt schon - es lebt nur nicht allzu lange, nämlich nur bis zur schließenden geschweiften Klammer. Danach hast du einen Zeiger auf ein nicht mehr existierendes Objekt in deinem vector.</p>
<p>Leg die Objekte mit new an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195931</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Thu, 21 Dec 2006 09:58:02 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 10:01:21 GMT]]></title><description><![CDATA[<p>Du erzeugst schon einen GeoShape, aber nur lokal - am Ende des if()-Blocks wird temp wieder vernichtet und der Zeiger, den du dir gemerkt hast, verweist auf irgendwelchen Datenmüll. Als Lösung mußt du dir dein Objekt auf dem Heap anlegen (und z.B. im Destruktor der GeoGroup wieder freigeben<sup>*</sup>):</p>
<pre><code class="language-cpp">if(!zeile.find(&quot;GeoPoint&quot;))
{
  GeoPoint* temp= new GeoPoint(&quot;0&quot;);
  istringstream l(zeile);
  l &gt;&gt; *temp;
  this-&gt;addGeoObject(temp);
}
</code></pre>
<p><sup>*</sup> Aber ich bin mir hier nicht ganz sicher über die Besitzverhältnisse (kann der selbe Punkt in mehreren Gruppen enthalten sein?) - besser wäre es womöglich, Smart-Pointer zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195936</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 21 Dec 2006 10:01:21 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 10:19:48 GMT]]></title><description><![CDATA[<p>Klar, danke.</p>
<p>Hatte es auch schon mit new() erzeugt aber vergessen das Referenzzeichen bei</p>
<pre><code class="language-cpp">this-&gt;addGeoObject(temp);
</code></pre>
<p>zu entfernen und dann hatte ich an der Baustelle erstmal aufgegeben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195948</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 21 Dec 2006 10:19:48 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 10:42:50 GMT]]></title><description><![CDATA[<p>Gloem schrieb:</p>
<blockquote>
<p>Der Fehler sieht so aus:<br />
PopUp mit Unhandled exception at 0x7c812a5b in Pflichtblatt2.exe: Microsoft C++ exception: std::__non_rtti_object at memory location 0x0013f9ac..</p>
</blockquote>
<p>Ist <code>GeoShape</code> dynamisch? Wenn nicht füge einfach mal <code>virtual ~GeoShape() { }</code> hinzu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195965</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Thu, 21 Dec 2006 10:42:50 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 10:46:24 GMT]]></title><description><![CDATA[<p>Einmal muss ich glaub ich noch:</p>
<p>meine beiden Methoden istream&amp; operator&gt;&gt;(..) und read(...) sehen nun so aus:</p>
<pre><code class="language-cpp">// Methode zum Einlesen einer GeoGroup
void GeoGroup::read(string first_line, istream&amp; is)
{
	// Eingabe in der Form: 
	// GeoGroup ID: nGG  Objekte: 
	// &lt;
	// GeoPoint ID: pointtemp  Geometrie: (6,6)
	// GeoGroup ID: mGG  Objekte: 
	// &lt;
	// GeoPoint ID: hPoi  Geometrie: (8,10)
	// GeoPolygon ID: jPol  Geometrie: {(-1,8)(0,10)(-4,11)(3,6)(-1,8)}
	// &gt;
	// GeoPolygon ID: polygontemp  Geometrie: {(4,6)(3,4)(2,5)(4,6)}
	// &gt;

	string id;
	string nix;
	string zeile;

	// Wenn keine Zeile übergeben wurde -&gt; erster Aufruf(keine Rekursion)
	if(first_line==&quot;&quot;)
	{
		getline(is,first_line, '\n');
	}
	// Abschneiden der ersten Teils des String bis zur ID
	id = first_line.substr(12, first_line.length());
	// Abschneiden des hinteren Teils des Strings zur ID
	id = id.substr(0, id.find(&quot; &quot;));
	// Setzen der eingelesenen ID
	this-&gt;setID(id.c_str());
	// Bis zum Ende der Zeile lesen
	getline(is, nix, '\n');
	// Die öffnende spitze Klammer einer Geogroup überlesen
	getline(is, nix, '\n');
	// Solange weiterlesen bis eine schließende spitze Klammer auftaucht
	while(is.peek() != '&gt;')
	{
		// Auslesen der Objektbezeichnung
		getline(is, zeile, '\n');
		// Prüfen ob GeoPoint
		if(!zeile.find(&quot;GeoPoint&quot;))
		{
			GeoPoint* temppoi = new GeoPoint(&quot;0&quot;);
			istringstream l(zeile);
			l &gt;&gt; *temppoi;
			this-&gt;addGeoObject(temppoi); 
		}
		// Prüfen ob GeoPolygon
		if(!zeile.find(&quot;GeoPolygon&quot;))
		{
			GeoPolygon* temppol = new GeoPolygon(&quot;0&quot;);
			istringstream l(zeile);
			l &gt;&gt; *temppol;
			this-&gt;addGeoObject(temppol);
		}
		// Prüfen auf GeoGroup
		if(!zeile.find(&quot;GeoGroup&quot;))
		{
			GeoGroup* tempgg = new GeoGroup(&quot;0&quot;);
			// Rekursiver Aufruf der read-Methode mit der Übergabe des GeoGroup-Anfangstrings
			(*tempgg).read(zeile, is);
			this-&gt;addGeoObject(tempgg);
		}
	}
}
</code></pre>
<pre><code class="language-cpp">// Überladen des globalen Output-Streams für die Eingabe einer GeoGroup
istream&amp; operator&gt;&gt;(istream&amp; is, GeoGroup&amp; g)
{
	// Aufruf der Methode zum Einlesen einer GeoGroup
	g.read(&quot;&quot;, is);

	return is;
}
</code></pre>
<p>Das Problem ist nun, das wohl nicht mehr alles verarbeitet wird und ich weiß nicht warum:</p>
<p>Eingabe:</p>
<pre><code>GeoGroup ID: nGG  Objekte: 
&lt;
GeoPoint ID: pointtemp  Geometrie: (6,6)
GeoGroup ID: mGG  Objekte: 
&lt;
GeoPoint ID: hPoi  Geometrie: (8,10)
GeoPolygon ID: jPol  Geometrie: {(-1,8)(0,10)(-4,11)(3,6)(-1,8)}
&gt;
GeoPolygon ID: polygontemp  Geometrie: {(4,6)(3,4)(2,5)(4,6)}
&gt;
</code></pre>
<p>Ausgabe:</p>
<pre><code>Ausgabe: GeoGroup ID:   Objekte:
&lt;
GeoGroup ID:   Objekte:
&lt;
GeoPolygon ID: jPol  Geometrie: {(-1,8)(0,10)(-4,11)(3,6)(-1,8)}
&gt;
&gt;
</code></pre>
<p>Kann mir jemand sagen, warum nicht mehr alle Objekte erzeugt werden? Irgendwie scheint mein this-Zeiger nicht mehr zu funktionieren</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195970</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 21 Dec 2006 10:46:24 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 10:50:03 GMT]]></title><description><![CDATA[<p>Du hast ein getline() zu viel in dem Code. Zu Beginn der Zeile 32 steht der Eingabezeiger am Anfang der &gt;-Zeile, dann überliest Zeile 32 diese Eingabezeile und Zeile 34 das erste Element deiner Gruppe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195977</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 21 Dec 2006 10:50:03 GMT</pubDate></item><item><title><![CDATA[Reply to istream rekursiv aufrufen on Thu, 21 Dec 2006 11:11:53 GMT]]></title><description><![CDATA[<p>Vielen Dank, darauf hätt ich auch selber kommen können.</p>
<p>Vielen Dank an alle, jetzt funktionierts. So viele und so schnelle Hilfe hatte ich bislang selten in einem Forum</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195986</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 21 Dec 2006 11:11:53 GMT</pubDate></item></channel></rss>