<?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[Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Szenario:</p>
<pre><code class="language-cpp">class Loo {

  private:
          //Daten
  public:
          //getter,setter etc.
};

ostream&amp; operator&lt;&lt;(ostream&amp; stream, const Loo&amp; obj)
{
    stream &lt;&lt; // ... obj-Daten ...
    return stream;
}

istream&amp; operator&gt;&gt;(istream&amp; stream, Loo&amp; obj)
{
    stream &gt;&gt; // in obj
    return stream;
}
</code></pre>
<p>Jetzt muss ich ja dafür sorgen das op&gt;&gt; und &lt;&lt; in gleicherweise arbeiten.<br />
Es kann ja auch vorkommen das op&gt;&gt; mit einem bestimmten Muster die Daten in den Stream schreibt und op&gt;&gt; muss mit diesem Muster die Daten wieder auslesen.</p>
<p>Man könnte ja leicht Fehler dabei machen. Gibt es da irgend einen Trick, ein Pattern oder sonstwas, was einem dabei hilft ?</p>
<p>Klar könnte man das Muster etc. weiter abstrahieren und so, damit man keinen Fehler macht, aber lassen wir das mal außer acht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/185691/ein-und-ausleseverfahren-von-eigenen-datentypen-konstistent-halten</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 05:36:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/185691.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 29 Jun 2007 20:48:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Fri, 29 Jun 2007 20:48:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Szenario:</p>
<pre><code class="language-cpp">class Loo {

  private:
          //Daten
  public:
          //getter,setter etc.
};

ostream&amp; operator&lt;&lt;(ostream&amp; stream, const Loo&amp; obj)
{
    stream &lt;&lt; // ... obj-Daten ...
    return stream;
}

istream&amp; operator&gt;&gt;(istream&amp; stream, Loo&amp; obj)
{
    stream &gt;&gt; // in obj
    return stream;
}
</code></pre>
<p>Jetzt muss ich ja dafür sorgen das op&gt;&gt; und &lt;&lt; in gleicherweise arbeiten.<br />
Es kann ja auch vorkommen das op&gt;&gt; mit einem bestimmten Muster die Daten in den Stream schreibt und op&gt;&gt; muss mit diesem Muster die Daten wieder auslesen.</p>
<p>Man könnte ja leicht Fehler dabei machen. Gibt es da irgend einen Trick, ein Pattern oder sonstwas, was einem dabei hilft ?</p>
<p>Klar könnte man das Muster etc. weiter abstrahieren und so, damit man keinen Fehler macht, aber lassen wir das mal außer acht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315308</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 29 Jun 2007 20:48:01 GMT</pubDate></item><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Fri, 29 Jun 2007 20:59:20 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>gute Frage - habe ich auch schon vermisst, aber ich vermute, dass das nicht geht ... oder eben nur mit so viel &quot;Metadaten&quot;, dass das sehr kompliziert und letztlich unkomfortabel und nicht wirklich weniger fehleranfällig ist.<br />
Alternativ könnte man natürlich alle seine Attribute in einen entsprechenden Container verpacken und den dann sequentiell ein- und auslesen - aber auch das macht den Zugriff auf die Attribute kompliziert und um einen generischen und trotzdem typsicheren Container muss man sich auch erstmal bemühen...<br />
(könnte man mit gemeinsamer Basisklasse für alle seine Atributtypen lösen)</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315316</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 29 Jun 2007 20:59:20 GMT</pubDate></item><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Fri, 29 Jun 2007 20:59:33 GMT]]></title><description><![CDATA[<p>versteh dein problem nicht. du willst mit daten eines streams dein objekt füllen?</p>
<p>und...</p>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;(istream&amp; stream, Loo&amp; obj)
{
    stream &gt;&gt; // in obj
    return stream;
}
</code></pre>
<p>wieso gibt der op nen stream zurück? wenn ich in dein objekt daten schubse, erwarte ich, dass nen objekt zurückgeliefert wird, in dass ich weitere daten schubsen kann. und nicht nen stream der... was genau macht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315317</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Fri, 29 Jun 2007 20:59:33 GMT</pubDate></item><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Fri, 29 Jun 2007 21:09:03 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>aus dem anderen Thread meine ich zu wissen, wo er sein Problem hat: Man kann z.B. bei längeren Attributlisten beim Einlesen versehentlich eine andere Reihenfolge bekommen als beim Schreiben (oder bei einer der beiden ein neues Attribut vergessen).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315323</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 29 Jun 2007 21:09:03 GMT</pubDate></item><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Fri, 29 Jun 2007 21:14:07 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>gute Frage - habe ich auch schon vermisst, aber ich vermute, dass das nicht geht ... oder eben nur mit so viel &quot;Metadaten&quot;, dass das sehr kompliziert und letztlich unkomfortabel und nicht wirklich weniger fehleranfällig ist.<br />
Alternativ könnte man natürlich alle seine Attribute in einen entsprechenden Container verpacken und den dann sequentiell ein- und auslesen - aber auch das macht den Zugriff auf die Attribute kompliziert und um einen generischen und trotzdem typsicheren Container muss man sich auch erstmal bemühen...<br />
(könnte man mit gemeinsamer Basisklasse für alle seine Atributtypen lösen)</p>
</blockquote>
<p>Hmmm, alles gute Ideen und je mehr ich darüber nachdenke um ne Lösung zu finden, fällt mir nichts besseres dazu ein, als das was du geschrieben hast.</p>
<p>thordk schrieb:</p>
<blockquote>
<p>versteh dein problem nicht. du willst mit daten eines streams dein objekt füllen?</p>
</blockquote>
<p>Simon hats verstanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>thordk schrieb:</p>
<blockquote>
<p>und...</p>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;(istream&amp; stream, Loo&amp; obj)
{
    stream &gt;&gt; // in obj
    return stream;
}
</code></pre>
<p>wieso gibt der op nen stream zurück? wenn ich in dein objekt daten schubse, erwarte ich, dass nen objekt zurückgeliefert wird, in dass ich weitere daten schubsen kann. und nicht nen stream der... was genau macht?</p>
</blockquote>
<p>Das ist schon richtig so, will schließlich den stream zurückbekommen und weiterhin damit arbeiten zu können:</p>
<pre><code class="language-cpp">istream file(&quot;...&quot;);
Loo a,b,c;

file &gt;&gt; a &gt;&gt; b &gt;&gt; c;
</code></pre>
<p>thordk schrieb:</p>
<blockquote>
<p>wenn ich in dein objekt daten schubse, erwarte ich, dass nen objekt zurückgeliefert wird, in dass ich weitere daten schubsen kann.</p>
</blockquote>
<pre><code class="language-cpp">file &gt;&gt; a;
</code></pre>
<p>Wäre ja wohl seltsam, wenn das Ergebnis des Audrucks, das a-Objekt wäre.</p>
<p>Denke mal du hast dich gerade irgendwie *verdenkt* <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315327</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 29 Jun 2007 21:14:07 GMT</pubDate></item><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Fri, 29 Jun 2007 21:19:02 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>...</p>
<p>thordk schrieb:</p>
<blockquote>
<p>versteh dein problem nicht. du willst mit daten eines streams dein objekt füllen?</p>
</blockquote>
<p>Simon hats verstanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
...</p>
</blockquote>
<p>Naja, kein Kunststück, wenn man die Frage bereits aus einem anderen Zusammenhang kennt ;)....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315332</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 29 Jun 2007 21:19:02 GMT</pubDate></item><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Fri, 29 Jun 2007 21:23:33 GMT]]></title><description><![CDATA[<p>*Aufgeflogen* <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Back to Topic ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315337</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 29 Jun 2007 21:23:33 GMT</pubDate></item><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Sat, 30 Jun 2007 07:30:41 GMT]]></title><description><![CDATA[<p>hoi<br />
du koenntest dir die beiden operatoren '&lt;&lt;, &gt;&gt;' als template schreiben und jeder klasse die streamfaehig sein soll z.b. eine Serialize und eine Deserialize methode verpassen. dann kuemmern sich die klassen selbst um die reihenfolge der daten.</p>
<pre><code class="language-cpp">class my_stream_class
{
   private:
      int value1, value2;

   public:
      void Serialize(std::ostream &amp;out) const
      {
         // hier in den stream schreiben. reihenfolge beachten 
      }
      void Deserialize(std::istream &amp;in)
      {
         // hier auslesen. auf die reihenfolge achten
      }
};

template&lt;class T&gt;
std::ostream&amp; operator&lt;&lt;(std::ostream &amp;out, const T &amp;value)
{
   value.Serialize(out);
   return out;
}

template&lt;class T&gt;
std::istream&amp; operator&gt;&gt;(std::istream &amp;in, T &amp;value)
{
   value.Deserialize(in);
   return in;
}
</code></pre>
<p>wenn ich es richtig im kopf habe muesste der kompiler gucken ob es eine bessere bzw. ueberladene funktion fuer 'T' gibt und diese auswaehlen. falls nix gefunden wird probiert er es mit dem template und versucht die methoden Serialize und Deserialize aufzurufen. dadurch sollte es mit build-ins usw. keine probleme geben. berichtigt mich mal wenn das falsch ist. hab mir das mal grad so zusammen gedacht.<br />
vielleicht auch noch einen konstruktor mit nem istream als parameter einrichten, dann kann das objekt seine initialisierungsdaten gleich aus dem stream rauslesen.</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315423</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 30 Jun 2007 07:30:41 GMT</pubDate></item><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Sat, 30 Jun 2007 11:21:06 GMT]]></title><description><![CDATA[<p>Hi Meep,</p>
<p>ich glaube, Du hast hier einen Vorschlag gemacht, der zwar nicht falsch ist, aber KasFs eigentliches Problem nicht löst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Meep Meep schrieb:</p>
<blockquote>
<pre><code class="language-cpp">...
      void Serialize(std::ostream &amp;out) const
      {
         // hier in den stream schreiben. reihenfolge beachten 
      }
      void Deserialize(std::istream &amp;in)
      {
         // hier auslesen. auf die reihenfolge achten
      }
...
</code></pre>
</blockquote>
<p>Genau DAS will KasF ja automatisieren: Die Vollständigkeit, richtige Reihenfolge und identisches Speicherformat aller Attribute.<br />
Ehrlich gesagt sehe ich in dem Einführen dieser Methoden keinen wirklichen Vorteil (außer, dass Javaprogrammierer es vllt. etwas schneller kapieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> )...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315537</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sat, 30 Jun 2007 11:21:06 GMT</pubDate></item><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Sat, 30 Jun 2007 13:28:44 GMT]]></title><description><![CDATA[<p>re</p>
<p>naja vollautomatisieren wird wohl schwer sein.<br />
koennte man sich auch einen codegenerator schreiben, dem man einfach die variablen , klassennamen usw. uebergibt und er erstellt mal das grundgeruest mit den stream-funktionen.</p>
<p>andere idee die vielleicht mal nen anfang machen koennte waere folgend:</p>
<pre><code class="language-cpp">class istream_operator
{
   typedef std::istream stream_type;
   stream_type &amp;stream_t;

   public:
      istream_operator(stream_type &amp;stream) : stream_t(stream) { }
      template&lt;class T&gt;
      istream_operator&amp; operator()(T &amp;value)
      {
         stream_t &gt;&gt; value;
         return *this;
      }
};

class ostream_operator
{
   typedef std::ostream stream_type;
   stream_type &amp;stream_t;

   public:
      ostream_operator(stream_type &amp;stream) : stream_t(stream) { }
      template&lt;class T&gt;
      ostream_operator&amp; operator()(const T &amp;value)
      {
         stream_t &lt;&lt; value &lt;&lt; &quot; &quot;;
         return *this;
      }
};
</code></pre>
<p>dann muss man in seiner klasse nur noch folgende template-funktion implementieren:</p>
<pre><code class="language-cpp">struct my_class
{
   int integer;
   float real;
   char c;
   bool b;

   template&lt;class T&gt;
   virtual void Streaming(T &amp;stream_type)   // &lt;- diese dada
   { 
      //hier gibt man dann die attribute der reihe nach ein.
      //im schoenen klammernstyle
      stream_type(integer)(real)(c)(b);
   }
};
</code></pre>
<p>und fuer die globalen stream-operatoren noch:</p>
<pre><code class="language-cpp">inline std::ostream&amp; operator&lt;&lt;(std::ostream &amp;out, const my_class &amp;my) 
{
   static_cast&lt;my_class&gt;(my).Streaming(ostream_operator(out));
   return out;
}

inline std::istream&amp; operator&gt;&gt;(std::istream &amp;in, my_class &amp;my)
{
   my.Streaming(istream_operator(in));
   return in;
}
</code></pre>
<p>der static_cast gefaellt mir da zwar ueberhaupt nicht, aber da is mir grad nix besseres eingefallen.</p>
<p>is das jetz sowas in der art wie KasF gesucht hat oder bin ich scho wieder meilenweit weg ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315643</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 30 Jun 2007 13:28:44 GMT</pubDate></item><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Sat, 30 Jun 2007 14:11:26 GMT]]></title><description><![CDATA[<p>@Meep Meep: Das gefällt mir schonmal sehr gut <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>Nur würde ich Streaming() const machen und an Streaming keine tempöreren Objekte übergeben, finde es schon komisch, dass du temporäre Objekte an nicht const Referenzen binden kannst ...</p>
<p>Das static_cast würde auch wegfallen. ( obwohl da doch ein const_cast hinmusste was Ref's castet ??? )</p>
<p>Trotzdem der entscheidende Punkt hier:</p>
<pre><code class="language-cpp">stream_type(integer)(real)(c)(b);
</code></pre>
<p>Was eigentlich keine Fehler zulässt und die op()'s auch einfach gehalten sind ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315667</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 30 Jun 2007 14:11:26 GMT</pubDate></item><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Sat, 30 Jun 2007 14:42:15 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>Nur würde ich Streaming() const machen</p>
</blockquote>
<p>wie willst du das machen ? dann bekommst beim einlesen leichte probleme. oder versteh ich dich da jetzt falsch ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315681</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 30 Jun 2007 14:42:15 GMT</pubDate></item><item><title><![CDATA[Reply to Ein- und Ausleseverfahren von eigenen Datentypen konstistent halten on Sat, 30 Jun 2007 15:06:06 GMT]]></title><description><![CDATA[<p>Ja stimmt, hast Recht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Habe mich irgendwie *verdenkt*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315692</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 30 Jun 2007 15:06:06 GMT</pubDate></item></channel></rss>