<?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[Iteratoren und Information-Hiding]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe ein Verständnisproblem bei der Verwendung von Iteratoren.<br />
In meinem Fall habe ich mit einer Darstellung einer Datenbank zu tun. Also gibt es eine Klasse &quot;Table&quot;, die wiederum eine Klasse &quot;Fields&quot;, die wiederum eine Ansammlung von Instanzen der Klasse &quot;Field&quot; enthält.</p>
<pre><code class="language-cpp">class Table
{
  private:
  Fields *fields_;

  public:
  Fields* getFields();
}

class Fields
{
  private:
  std::vector &lt;Field*&gt; fields_;
}

class Field
{
  private:
  std::string name_;
  std::string datatype_;
  ...
}
</code></pre>
<p>Jetzt möchte ich &quot;von außen&quot; über die Elemente in Fields::fields_ iterieren können, d.h. einen Iterator definieren, wo ich einfach mit ++ zum nächsten Element kommen.</p>
<p>Etwas der Art</p>
<pre><code class="language-cpp">Iterator iter;
//hier möchte ich mich nicht um die interne Struktur von &quot;Fields&quot; kümmern
for (iter=table-&gt;getFields()-&gt;begin();iter != table-&gt;getFields()-&gt;end();iter++)
{
  ...
}
</code></pre>
<p>hätte ich gerne<br />
Mein Problem ist dabei, daß ich die Datenstruktur dahinter (diesen std::vector) verstecken möchte, da es sich ja um eine interne Repräsentation handelt.</p>
<p>Könnt ihr mir dabei weiterhelfen?</p>
<p>Danke und Gruß,<br />
Joe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/126716/iteratoren-und-information-hiding</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 19:56:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/126716.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Nov 2005 08:08:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iteratoren und Information-Hiding on Fri, 18 Nov 2005 08:08:01 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe ein Verständnisproblem bei der Verwendung von Iteratoren.<br />
In meinem Fall habe ich mit einer Darstellung einer Datenbank zu tun. Also gibt es eine Klasse &quot;Table&quot;, die wiederum eine Klasse &quot;Fields&quot;, die wiederum eine Ansammlung von Instanzen der Klasse &quot;Field&quot; enthält.</p>
<pre><code class="language-cpp">class Table
{
  private:
  Fields *fields_;

  public:
  Fields* getFields();
}

class Fields
{
  private:
  std::vector &lt;Field*&gt; fields_;
}

class Field
{
  private:
  std::string name_;
  std::string datatype_;
  ...
}
</code></pre>
<p>Jetzt möchte ich &quot;von außen&quot; über die Elemente in Fields::fields_ iterieren können, d.h. einen Iterator definieren, wo ich einfach mit ++ zum nächsten Element kommen.</p>
<p>Etwas der Art</p>
<pre><code class="language-cpp">Iterator iter;
//hier möchte ich mich nicht um die interne Struktur von &quot;Fields&quot; kümmern
for (iter=table-&gt;getFields()-&gt;begin();iter != table-&gt;getFields()-&gt;end();iter++)
{
  ...
}
</code></pre>
<p>hätte ich gerne<br />
Mein Problem ist dabei, daß ich die Datenstruktur dahinter (diesen std::vector) verstecken möchte, da es sich ja um eine interne Repräsentation handelt.</p>
<p>Könnt ihr mir dabei weiterhelfen?</p>
<p>Danke und Gruß,<br />
Joe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/920247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/920247</guid><dc:creator><![CDATA[joerider]]></dc:creator><pubDate>Fri, 18 Nov 2005 08:08:01 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren und Information-Hiding on Fri, 18 Nov 2005 08:15:34 GMT]]></title><description><![CDATA[<p>du weißt, dass</p>
<pre><code>std::vector &lt;Field*&gt; fields_
</code></pre>
<p>private ist und damit kein zugriff &quot;von außen&quot; möglich ist....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/920251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/920251</guid><dc:creator><![CDATA[Domian666]]></dc:creator><pubDate>Fri, 18 Nov 2005 08:15:34 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren und Information-Hiding on Fri, 18 Nov 2005 08:20:38 GMT]]></title><description><![CDATA[<p>Bei deinem Design kannst du das private direkt weglassen - getFields() hat die selbe Wirkung, als ob du direkt auf die privaten Daten zugreifen würdest.</p>
<p>Zum Kernproblem: Dazu mußt du die entsprechenden Iterator-Definitionen in deiner Field-Klasse bereitstellen:</p>
<pre><code class="language-cpp">class Fields
{
public:
  typedef vector&lt;Field*&gt; F_Vec;
  typedef F_Vec::iterator iterator;
  iterator begin() {return _data.begin();}
  iterator end() {return _data.end();}
private:
  F_Vec _data;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/920253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/920253</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 18 Nov 2005 08:20:38 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren und Information-Hiding on Fri, 18 Nov 2005 08:26:03 GMT]]></title><description><![CDATA[<p>... da war jemand schneller (bezieht sich auf das vorherige)</p>
<p>weiß ich! <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="🙂"
    /><br />
Das Ganze soll nur der Veranschaulichung dienen, weil sonst niemand das Problem versteht.</p>
<p>Genau dort ist auch das Problem. Wenn ich das Zeug public mache, dann weiß ich ja von außen, daß es sich um einen std::vector handelt.<br />
Ich will eben außen nicht</p>
<pre><code>std::vector &lt;Field*&gt;::iterator iter
</code></pre>
<p>schreiben müssen.</p>
<p>Joe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/920260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/920260</guid><dc:creator><![CDATA[joerider]]></dc:creator><pubDate>Fri, 18 Nov 2005 08:26:03 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren und Information-Hiding on Fri, 18 Nov 2005 08:29:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>:</p>
<pre><code>typedef vector&lt;Field*&gt; F_Vec;
  typedef F_Vec::iterator iterator;
</code></pre>
<p>Damit ist doch wieder außen sichtbar, welche Datenstruktur ich innen verwendet habe, oder?</p>
<p>Ich werde auf jeden Fall einmal damit &quot;herumexperimentieren&quot;. Danke</p>
<p>Joe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/920266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/920266</guid><dc:creator><![CDATA[joerider]]></dc:creator><pubDate>Fri, 18 Nov 2005 08:29:26 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren und Information-Hiding on Fri, 18 Nov 2005 08:42:03 GMT]]></title><description><![CDATA[<p>Du kannst auch einen eigenen Fields-Iterator schreiben <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>
<pre><code class="language-cpp">class Fields
{
public:
  class iterator
  {
    iterator(const Fields* fld,vector&lt;Fields&gt;::iterator pos)
      : _fld(fld),_pos(pos) {};
    friend class Fields;
  public:
    iterator&amp; operator++() {++_pos;return *this;}
    iterator  operator++(int);
    //...
    //alle benötigten Iterator-Operationen
  private:
    const Field* _fld;
    vector&lt;Fields*&gt;::iterator _pos;
  };
  friend class iterator;

  iterator begin() {return iterator(this,_data.begin());}
  //...
private:
  vector&lt;Fields*&gt; _data;
}
</code></pre>
<p>joerider schrieb:</p>
<blockquote>
<p>Ich will eben außen nicht</p>
<pre><code>std::vector &lt;Field*&gt;::iterator iter
</code></pre>
<p>schreiben müssen.</p>
<p>Joe</p>
</blockquote>
<p>Deswegen ja die typedef's - dann schreibst du von außen nur noch:</p>
<pre><code class="language-cpp">Fields::iterator iter;
</code></pre>
<p>(und dem Nutzer kann es letztendlich egal sein, ob hinter Fields::iterator nun ein normaler vector-Iterator, set-Iterator oder eine eigene Klasse steht - solange diese die benötigten Operatoren (++,--,*,-&gt;,...) bereitstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/920272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/920272</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 18 Nov 2005 08:42:03 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren und Information-Hiding on Fri, 18 Nov 2005 08:46:11 GMT]]></title><description><![CDATA[<p>Überdenke dein Design.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/920278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/920278</guid><dc:creator><![CDATA[...........]]></dc:creator><pubDate>Fri, 18 Nov 2005 08:46:11 GMT</pubDate></item></channel></rss>