<?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[Frage zu STL und Iterator]]></title><description><![CDATA[<p>Hallo!</p>
<p>(Bevor jetzt jemand auf die Verwendung von vector verweist - ich mach das ganze um die STL genauer kennenzulernen)</p>
<p>Ich versuche gerade eine Klasse zu programmieren, welche STL mäßig aufgebaut ist, also Container sowie Iterator. Und darauf möchte ich dann die Algorithmen der STL anwenden.</p>
<p>Nun hab ich ganz einen einfachen Container gestrickt welcher Objekte vom Typ T in einem dynamischen Array aufnehmen kann.<br />
Innerhalb des Containers habe ich weiters eine Iterator Klasse definiert.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class myArray
{
 ...
 public:
 class iterator
 {
  ...
  T* current;
  ...
 }
 ...
};
</code></pre>
<p>Nun zur Frage: Wie schaffe ich es, den Iterator insowfern intelligent zu machen, dass er nicht über den Array Bereich hinausläuft?<br />
Also z.B. im Falle:</p>
<pre><code class="language-cpp">iterator&amp; operator++()
{
    current++;
    return *this;
}
</code></pre>
<p>Wäre die dahinterliegende Datenstruktur eine einfach verkettete Liste, so wäre die Abfrage ja einfach: zuerst prüfen ob man bereits am Listenende angekommen ist, und wenn ja, dann wird der Iterator nicht mehr erhöht, er bleibt also bei end() stehen.<br />
Weiters wäre eine gewisse Intelligenz wünschenswert beim Dereferenzieren, also beim operator*(). Ich möchte in dem Fall vermeiden, dass auf end() zugegriffen werden kann - da hier außerhalb des reservierten Speicherbereichs zugegriffen wird.</p>
<p>Hat jemand eine Idee, wie ich es schaffe, dass der Iterator mehr Informationen über das Objekt erhält, über das er gerade iteriert, sodass ich die erwähnten Schutzmechanismen einbauen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303515/frage-zu-stl-und-iterator</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 16:07:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303515.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 May 2012 23:12:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu STL und Iterator on Tue, 15 May 2012 23:12:15 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>(Bevor jetzt jemand auf die Verwendung von vector verweist - ich mach das ganze um die STL genauer kennenzulernen)</p>
<p>Ich versuche gerade eine Klasse zu programmieren, welche STL mäßig aufgebaut ist, also Container sowie Iterator. Und darauf möchte ich dann die Algorithmen der STL anwenden.</p>
<p>Nun hab ich ganz einen einfachen Container gestrickt welcher Objekte vom Typ T in einem dynamischen Array aufnehmen kann.<br />
Innerhalb des Containers habe ich weiters eine Iterator Klasse definiert.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class myArray
{
 ...
 public:
 class iterator
 {
  ...
  T* current;
  ...
 }
 ...
};
</code></pre>
<p>Nun zur Frage: Wie schaffe ich es, den Iterator insowfern intelligent zu machen, dass er nicht über den Array Bereich hinausläuft?<br />
Also z.B. im Falle:</p>
<pre><code class="language-cpp">iterator&amp; operator++()
{
    current++;
    return *this;
}
</code></pre>
<p>Wäre die dahinterliegende Datenstruktur eine einfach verkettete Liste, so wäre die Abfrage ja einfach: zuerst prüfen ob man bereits am Listenende angekommen ist, und wenn ja, dann wird der Iterator nicht mehr erhöht, er bleibt also bei end() stehen.<br />
Weiters wäre eine gewisse Intelligenz wünschenswert beim Dereferenzieren, also beim operator*(). Ich möchte in dem Fall vermeiden, dass auf end() zugegriffen werden kann - da hier außerhalb des reservierten Speicherbereichs zugegriffen wird.</p>
<p>Hat jemand eine Idee, wie ich es schaffe, dass der Iterator mehr Informationen über das Objekt erhält, über das er gerade iteriert, sodass ich die erwähnten Schutzmechanismen einbauen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212000</guid><dc:creator><![CDATA[stl mal wieder]]></dc:creator><pubDate>Tue, 15 May 2012 23:12:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Tue, 15 May 2012 23:16:40 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;class T&gt;
class myArray
{
 ...
 public:
 class iterator
 {
  ...
  T* current;
  ...
#ifdef DEBUG
   myArray&amp; theArray;
#endif
 }
 ...
};
</code></pre>
<p>Dann kannste testen, was Du magst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212001</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 15 May 2012 23:16:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Tue, 15 May 2012 23:41:34 GMT]]></title><description><![CDATA[<p>Nagut, dann stellt sich aber noch die Frage:<br />
Wie bekomme ich die Referenz auf die &quot;umgebende&quot; Klasse.<br />
Container und Iteratorklasse sind ja verschachtelt.<br />
Und somit kann die innere Klasse ja nur auf statische Vars der äußeren Klasse zugreifen!?</p>
<p>in main siehts ungefähr so aus:</p>
<pre><code class="language-cpp">//Container
myArray&lt;int&gt; array(10);

//und dazu iterator holen
myArray&lt;int&gt;::iterator iter=array.begin();

/*iter zeigt mir nun auf ein element, aber um den iterator mit intelligenz auszustatten müsste der iterator ja etwas mehr wissen über die umgebende klasse.
also sowas in der art:
*/
myArray&lt;int&gt;::iterator iter(array);

/*irgendwie schaffen es die STL Container und Iteratoren ja auch, z.B. vector.
und das ohne diese komische initialisierung wie in der oberen codezeile mit iter(array)*/
</code></pre>
<p>Steh grad aufm Schlauch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212006</guid><dc:creator><![CDATA[stl mal wieder]]></dc:creator><pubDate>Tue, 15 May 2012 23:41:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Tue, 15 May 2012 23:47:02 GMT]]></title><description><![CDATA[<p>Hä? Du übergibst *this in my_array.begin(), ist doch klar?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212008</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 15 May 2012 23:47:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 00:04:00 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Hä? Du übergibst *this in my_array.begin(), ist doch klar?</p>
</blockquote>
<p>War ja klar dass das so einfach ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212009</guid><dc:creator><![CDATA[stl mal wieder]]></dc:creator><pubDate>Wed, 16 May 2012 00:04:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 07:53:49 GMT]]></title><description><![CDATA[<p>...wobei das Objekt mit einer Referenz als Element nicht vernünftig zuweisbar wird. Das ist natürlich für einen Iterator kein Zustand.</p>
<p>Ich habe festgestellt, dass man für Zeiger-artige Objekte eher Zeiger-Elemente verwenden sollte und für Referenz-artige Objekte (Proxies &amp; co) eher Referenzen als Elemente. Bedenke dabei den vom Compiler eventuell generierten Zuweisungsoperator.</p>
<p>Der std::reference_wrapper ist dabei eher ein komischer Mischmasch. Manchmal verhält sich das Ding wie ein Zeiger, manchmal wie eine Referenz. Wenn ich einem reference_wrapper&lt;int&gt; einen anderen reference_wrapper&lt;int&gt; zuweise, dann verhalten sie sich Zeiger-artig. Wenn ich einem reference_wrapper&lt;int&gt; einen int zuweise, dann verhält sich das Ding Referenz-artig. Damit beides funktioniert, muss ein reference_wrapper aber einen Zeiger speichern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212092</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 16 May 2012 07:53:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 07:56:19 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>...wobei das Objekt mit einer Referenz als Element nicht vernünftig zuweisbar wird. Das ist natürlich für einen Iterator kein Zustand.</p>
</blockquote>
<p>Da habe ich ausnahmsweise mal &amp; benutzt, um anzuzeigen, daß der pointee grundsätzlich am Leben sein muss, und ich kriege gleich Haue. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Ich habe festgestellt, dass man für Zeiger-artige Objekte eher Zeiger-Elemente verwenden sollte und für Referenz-artige Objekte (Proxies &amp; co) eher Referenzen als Elemente.</p>
</blockquote>
<p>Boah, wie soll ich ein Gefühl dafür entwickeln, was &quot;referenz-artig&quot; ist? Ich vermute fast, ich sollte generell Zeiger bevorzugen und Referenzen meiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212099</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 May 2012 07:56:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 08:07:49 GMT]]></title><description><![CDATA[<p>Zeiger-artig: Ein Iterator<br />
(ist selbst ein Objekt, kann man dazu bringen auf andere Objekte zu zeigen, indem man Iteratoren tauscht, einander zuweist, operator++ benutzt, etc etc etc)</p>
<p>Referenz-artig: Z.B. vector&lt;bool&gt;::reference<br />
Das Objekt soll eine Referenz emulieren. Zuweisungsn beziehen sich immer auf das referenzierte Objekt. Dementsprechend ist eine Referenz als Element praktisch, um Zeiger-Semantik zu umgehen; denn wenn ich</p>
<pre><code class="language-cpp">myboolvec[3] = myboolvec[4];
</code></pre>
<p>schreibe, will ich, dass sich der Vektor ändert und nicht das temporäre &quot;Referenzobjekt&quot;. Eine Referenz lässt sich ja normalerweise nicht mehr umbiegen. Mit einer Referenz als Element fällt auch gleich der vom Compiler generierte Zuweisungsoperator weg, den wir hier ja eh nicht brauchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212105</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 16 May 2012 08:07:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 11:12:30 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Hab die Klasse mit Container+Iterator jetzt fertig.<br />
Derzeit nur bidirectional Iterator, werd ich aber noch erweitern auf random access. Funktioniert auch soweit ich das jetzt getestet habe.</p>
<p>Könnt ihr mal kurz über den Code drüber schauen und sagen, was nicht passt und was ihr anders machen würdet?<br />
Bin wie schon gesagt beim C++ lernen und freue mich daher über jedes Feedback!</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class safeArray
{
    public:
        typedef T value_type;
        typedef T* pointer;
        typedef T&amp; reference;
        typedef size_t size_type;
        typedef ptrdiff_t difference_type;

        safeArray(const size_t count)
        :m_count(count)
        {
            m_array=new T[m_count];
        }

        virtual ~safeArray()
        {
            delete[] m_array;
        }

        safeArray(const safeArray&amp; original)
        :m_count(original.m_count)
        {
            m_array=new T[m_count];

            for(size_t i=0;i&lt;m_count;i++)
                m_array[i]=original.m_array[i];
        }

        safeArray&amp; operator=(const safeArray&amp; rhs)
        {
                safeArray temp(rhs);

                std::swap(m_array,temp.m_array);
                std::swap(m_count,temp.m_count);
                return *this;
        }

        void print() const
        {
            for(size_t i=0;i&lt;m_count;i++)
                std::cout&lt;&lt;m_array[i]&lt;&lt;std::endl;
        }

    private:
        T* m_array;
        size_t m_count;

    public:
        class iterator
        {
            public:
                typedef std::bidirectional_iterator_tag iterator_category;
                typedef T value_type;
                typedef T* pointer;
                typedef T&amp; reference;
                typedef size_t size_type;
                typedef ptrdiff_t difference_type;

                iterator(const safeArray* refSafeArray, const size_t index)
                :m_refToSafeArray(refSafeArray)
                {
                    if(index&gt;=0 &amp;&amp; index&lt;=m_refToSafeArray-&gt;m_count)
                        m_current=index;
                    else
                        m_current=m_refToSafeArray-&gt;m_count;
                }

                T&amp; operator*()
                {
                    return m_refToSafeArray-&gt;m_array[m_current];
                }

                const T&amp; operator*() const
                {
                    return m_refToSafeArray-&gt;m_array[m_current];
                }

                iterator&amp; operator++()
                {
                    if(m_current&lt;m_refToSafeArray-&gt;m_count)
                        m_current++;
                    return *this;
                }

                iterator operator++(int)
                {
                    iterator temp(*this);
                    ++(*this);

                    return temp;
                }

                iterator&amp; operator--()
                {
                    if(m_current&gt;0)
                        m_current--;
                    return *this;
                }

                iterator operator--(int)
                {
                    iterator temp(*this);
                    --(*this);

                    return temp;
                }

                const bool operator==(const iterator&amp; iterSecond) const
                {
                    return m_current==iterSecond.m_current;
                }

                const bool operator!=(const iterator&amp; iterSecond) const
                {
                    return m_current!=iterSecond.m_current;
                }

            private:
                size_t m_current;
                const safeArray* m_refToSafeArray;
        };

        iterator begin() const
        {
            return iterator(this,0);
        }

        iterator end() const
        {
            return iterator(this,m_count);
        }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2212167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212167</guid><dc:creator><![CDATA[stl mal wieder]]></dc:creator><pubDate>Wed, 16 May 2012 11:12:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 11:27:56 GMT]]></title><description><![CDATA[<p>Default-Konstruktor sollte her, damit man so Dinger selber wieder in Arrays stopfen kann.</p>
<p>Destruktor nicht virtual. Von sowas soll man nicht erben.</p>
<p>Was passiert, wenn in der Elementzuweisung im Kopierkonstruktor eine Exception fliegt?</p>
<p>print sollte '\n' statt std::endl benutzen.</p>
<p>sollte if(index&gt;=0 &amp;&amp; index&lt;=m_refToSafeArray-&gt;m_count) nicht if(index&gt;=0 &amp;&amp; index&lt;m_refToSafeArray-&gt;m_count) heißen?</p>
<p>Ebenso return iterator(this,m_count); wohl return iterator(this,m_count-1);</p>
<p>Aber was DU da fabrizierst, ist höchst bedenklich. Du verschleierst damit nur Programmierfehler bei der Array-Bedienung! Prüfen ist gut. Aber dann hart herausgehen. Am besten mit sowas wie assert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212176</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 May 2012 11:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 11:31:46 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>sollte if(index&gt;=0 &amp;&amp; index&lt;=m_refToSafeArray-&gt;m_count) nicht if(index&gt;=0 &amp;&amp; index&lt;m_refToSafeArray-&gt;m_count) heißen?</p>
<p>Ebenso return iterator(this,m_count); wohl return iterator(this,m_count-1);</p>
</blockquote>
<p>Sollten Ende-Iteratoren nicht eins hinter das letzte Element zeigen? <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/2212180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212180</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 16 May 2012 11:31:46 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 11:34:58 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Sollten Ende-Iteratoren nicht eins hinter das letzte Element zeigen? <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>
</blockquote>
<p>Ups, ja. Dann sind die beiden korrekt.<br />
Aber dann kann ich ins Nirvana schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212183</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 May 2012 11:34:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 11:42:54 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>wie kann ich den iterator bis zum letzten element laufen lassen?<br />
tree::treeiterator it = t.begin(); it != t.end(); it = it.next()</p>
<pre><code class="language-cpp">class tree
{
private:
	class node *root;

public:
	class treeiterator
	{
	private:
		std::stack&lt;class node*&gt; stack;
		class node *now;
		class node *end;
		class tree *ptree;
		bool left;
		bool right;

	public:
		treeiterator(class tree *tree_): now(NULL), left(false), right(false)
		{
			ptree = tree_;
		}

		void start_at_beginning()
		{
			now = ptree-&gt;get_root_node();
			stack.push(now);
		}

		void start_at_end()
		{
			now = ptree-&gt;get_root_node();
			std::stack&lt;class node*&gt; stack_tmp;

			while(true)
			{
				if(now-&gt;left) 
				{
					stack_tmp.push(now-&gt;right); 
				}
				if(now-&gt;right)
				{
					stack_tmp.push(now-&gt;left); 
				}

				if (!stack_tmp.empty()) 
				{ 
					now = stack_tmp.top(); 
					stack_tmp.pop(); 
				} 
				else
				{
					break;
				}
			}
		}

		class node *get_node()
		{
			return now;
		}

		treeiterator &amp;next() // next iterator for Depth first Search
		{
			if (now-&gt;left) 
			{
				stack.push(now-&gt;right); 
			}
			if (now-&gt;right) 
			{
				stack.push(now-&gt;left); 
			}
			if (!stack.empty()) 
			{ 
				now = stack.top(); 
				stack.pop(); 
			}
			else
			{
				now = NULL;
			}

			return *this;
		}

		bool operator== (treeiterator &amp;it)
		{
			return this-&gt;get_node() == it.get_node();
		}

		bool operator!= (treeiterator &amp;it)
		{
			return this-&gt;get_node() != it.get_node();
		}

		node operator*()
		{
			return *get_node();
		}
	};

public:
	tree(): root(NULL) {}

	class node *get_root_node()
	{
		return root;
	}

	class treeiterator begin()
	{
		class treeiterator it(this); 
		it.start_at_beginning(); 
		return it;
	}

	class treeiterator end()
	{
		class treeiterator it(this); 
		it.start_at_end(); 
		return it;
	}
};
</code></pre>
<pre><code class="language-cpp">for(tree::treeiterator it = t.begin(); it != t.end(); it = it.next())
	{
		cout &lt;&lt; it.get_node()-&gt;value;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2212189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212189</guid><dc:creator><![CDATA[iter]]></dc:creator><pubDate>Wed, 16 May 2012 11:42:54 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 11:58:46 GMT]]></title><description><![CDATA[<p><strong>Default-Konstruktor sollte her, damit man so Dinger selber wieder in Arrays stopfen kann.</strong></p>
<p>Ok. Könnte ich ja ganz einfach einbauen mit einem Default-Argument im Ctor.</p>
<p><strong>Destruktor nicht virtual. Von sowas soll man nicht erben.</strong></p>
<p>Ok. Was ist das Problem wenn man unnötigerweise virtual verwendet? Nur unnötiger Overhead durch die vtables oder wie die heißen oder auch sonst noch Probleme?</p>
<p><strong>Was passiert, wenn in der Elementzuweisung im Kopierkonstruktor eine Exception fliegt?</strong><br />
Tja, gute Frage.<br />
Wenn ich ein try catch mache, welches mir im catch Block dann den neuen Speicher wieder freigibt, und ich dann normal weitermache, so bekomm ich beim dtor ein Problem weil mir delete[] Speicher freigeben will denn es nicht mehr gibt!?<br />
Was wäre die Lösung? Vielleicht Speicher=0 setzen nach delete[] und dies im Dtor nochmals prüfen bevor ich mit delete[] drüberfahre?</p>
<pre><code class="language-cpp">safeArray(const safeArray&amp; original)
        :m_count(original.m_count)
        {
            m_array=new T[m_count];

            for(size_t i=0;i&lt;m_count;i++)
                m_array[i]=original.m_array[i];
        }
</code></pre>
<p><strong>print sollte '\n' statt std::endl benutzen.</strong></p>
<p>OK.</p>
<p>**<br />
sollte if(index&gt;=0 &amp;&amp; index&lt;=m_refToSafeArray-&gt;m_count) nicht if(index&gt;=0 &amp;&amp; index&lt;m_refToSafeArray-&gt;m_count) heißen?</p>
<p>Ebenso return iterator(this,m_count); wohl return iterator(this,m_count-1);**</p>
<p>s.o. wegen end() = eins hinter letztem Element.<br />
Naja, iter=end; <em>iter=value; sollte ich ja verhindern, stimmt schon (&quot;ins Nirvana schreiben&quot;).<br />
Also wenn ich beim operator</em>() merke, dass an einer Stelle dereferenziert wird, die nicht im gültigen Bereich liegt, raus mit Exception/assert?</p>
<p><strong>Aber was DU da fabrizierst, ist höchst bedenklich. Du verschleierst damit nur Programmierfehler bei der Array-Bedienung! Prüfen ist gut. Aber dann hart herausgehen. Am besten mit sowas wie assert.</strong></p>
<p>Wie meinst du das genau?<br />
Sobald also ein in irgendeiner Weise falscher Zugriff aufs safeArray erfolgt sofort Exception werfen? Viel &quot;radikaler&quot; mit falschen Zugriffen umgehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212202</guid><dc:creator><![CDATA[stl mal wieder]]></dc:creator><pubDate>Wed, 16 May 2012 11:58:46 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 12:13:22 GMT]]></title><description><![CDATA[<p>stl mal wieder schrieb:</p>
<blockquote>
<p>Wie meinst du das genau?<br />
Sobald also ein in irgendeiner Weise falscher Zugriff aufs safeArray erfolgt sofort Exception werfen? Viel &quot;radikaler&quot; mit falschen Zugriffen umgehen?</p>
</blockquote>
<p>Sogar assert statt exceptions. ~(Wobei ich ein heimlicher Freund von AssertExceptions bin.)~</p>
<blockquote>
<pre><code class="language-cpp">safeArray(const size_t count)
        :m_count(count)
        {
            m_array=new T[m_count];
        }
</code></pre>
</blockquote>
<p>const unsinnig<br />
size_t schlecht, verbirgt minuszahlenfehler</p>
<pre><code class="language-cpp">safeArray(int count)
        :m_count(count)
        {
            assert(count&gt;=0);
            m_array=new T[m_count];
        }
</code></pre>
<p>Auch beim</p>
<pre><code class="language-cpp">if(index&gt;=0 &amp;&amp; index&lt;=m_refToSafeArray-&gt;m_count)
</code></pre>
<p>kann sollte evtl aus diesem Gund index wohl ein int sein.<br />
Ok, absolut unüblich für Arrays. Aber man sieht noch schneller, ob's eine Unter- oder Überschreitung war.</p>
<p>Ja, das virtual macht nur ein Bißchen lahmer, schadet aber ansonsten gar nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212205</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 May 2012 12:13:22 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 12:12:01 GMT]]></title><description><![CDATA[<p>stl mal wieder schrieb:</p>
<blockquote>
<p>Was wäre die Lösung? Vielleicht Speicher=0 setzen nach delete[] und dies im Dtor nochmals prüfen bevor ich mit delete[] drüberfahre?</p>
</blockquote>
<p>Nee! Mach sowas nicht. Das ist am Ende auch nicht sicherer.<br />
Überhaupt setze ich nie nach dem delete irgend einen Zeiger auf 0.</p>
<p>Du könntest mit try/catch schauen, ob eine Exception geflogen ist, gegebenenfalls löschen und sie weiterwerfen.<br />
Oder Du faßt den Speicher dort mit einem Smart-Pointer an, der im Exceptionfall löscht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212206</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 May 2012 12:12:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 12:24:33 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>size_t schlecht, verbirgt minuszahlenfehler</p>
<pre><code class="language-cpp">safeArray(int count)
        :m_count(count)
        {
            assert(count&gt;=0);
            m_array=new T[m_count];
        }
</code></pre>
<p>Auch beim</p>
<pre><code class="language-cpp">if(index&gt;=0 &amp;&amp; index&lt;=m_refToSafeArray-&gt;m_count)
</code></pre>
<p>kann sollte evtl aus diesem Gund index wohl ein int sein.<br />
Ok, absolut unüblich für Arrays. Aber man sieht noch schneller, ob's eine Unter- oder Überschreitung war.</p>
</blockquote>
<p>Nicht dein Ernst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212212</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 16 May 2012 12:24:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 12:48:12 GMT]]></title><description><![CDATA[<blockquote>
<p>Ok. Was ist das Problem wenn man unnötigerweise virtual verwendet? Nur unnötiger Overhead durch die vtables oder wie die heißen oder auch sonst noch Probleme?</p>
</blockquote>
<p>1. Technik:<br />
ja, du erzeugst ne vtable, wo keine sein muss, und nimmst dem compiler damit evtl. auch Optimierungsmöglichkeiten.</p>
<p>2. Philosophie:<br />
(alle wissen es !? aber keiner weiss wo es steht ! ^^ also quasi ungeschriebenes Gesetz!) Du gibst anderen Nutzern mit einem virtuellen Dtor zu verstehen, das deine Klasse hervorragend zum Ableiten geeignet ist ... oder so ähnlich ^^ und genau das ist eigentlich nicht der Fall ... Das klasseninterface an sich ist ok, aber es ist alles andere als &quot;gut zum Ableiten&quot; geeignet <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 />
Deine Klasse ist als Implementation, also zum (wieder)verwenden designt, da ist Aggregation / Komposition Mittel der Wahl.<br />
Polymorphie, sollte der Hauptanwendungsfall von Vererbung sein, also das austauschen von typen zur laufzeit (zur compilezeit sind Templates meist die bessere Wahl), und das willst du mit deiner klasse glaub ich nicht erreichen ^^</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212231</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 16 May 2012 12:48:12 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 12:54:31 GMT]]></title><description><![CDATA[<p>Naja, schwupps, habe ich eine Klasse PersistentesArray von safeArray abgeleitet, die als zuätzliches Attribut einen Dateinamen als String hat und im Konstruktor die Datei liest und im Destruktor die Datei schreibt.<br />
Zu Aggregation habe ich keine Lust, weil ich das ganze Zugriff-Geraffele per Hand weiterleiten müßte.<br />
Erbe ich normalerweise nicht von Containern, weil sie normalerweise keinen virtuellen Destruktor haben oder ist es umgegehrt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212233</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 May 2012 12:54:31 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 12:58:48 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3842">@RHBaum</a>: Vor allem Punkt 2 ist ein gutes Argument, danke für die Ausführungen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a>: Nochwas zu den assert's:</p>
<pre><code class="language-cpp">iterator(const safeArray* refSafeArray, int index)
                :m_refToSafeArray(refSafeArray)
                {
                    assert(index&gt;=0 &amp;&amp; index&lt;=m_refToSafeArray-&gt;m_count);
                    m_current=index;
                }
</code></pre>
<p>Jetzt habe ich da einen Vergleich zwischen signed und unsigned.<br />
Und: Woher weiß ich, dass size_t int und nicht long oder long long ist?<br />
Oder ist size_t definitionsgemäß unsigned int?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212235</guid><dc:creator><![CDATA[stl mal wieder]]></dc:creator><pubDate>Wed, 16 May 2012 12:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 13:37:06 GMT]]></title><description><![CDATA[<p>stl mal wieder schrieb:</p>
<blockquote>
<p>Jetzt habe ich da einen Vergleich zwischen signed und unsigned.<br />
Und: Woher weiß ich, dass size_t int und nicht long oder long long ist?<br />
Oder ist size_t definitionsgemäß unsigned int?</p>
</blockquote>
<p>Nee. int ist keineswegs richtig, sondern nur für Nubes eine Hilfe, die dauernd Fehler machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212245</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 May 2012 13:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 13:37:59 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Naja, schwupps, habe ich eine Klasse PersistentesArray von safeArray abgeleitet, die als zuätzliches Attribut einen Dateinamen als String hat und im Konstruktor die Datei liest und im Destruktor die Datei schreibt.</p>
</blockquote>
<p>Die Klasse hat also zwei Aufgaben, die nichts miteinander zu tun haben.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Erbe ich normalerweise nicht von Containern, weil sie normalerweise keinen virtuellen Destruktor haben oder ist es umgegehrt?</p>
</blockquote>
<p>Weil es überhaupt keinen Sinn ergibt. Das hat nichts mit Destruktoren zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212246</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 16 May 2012 13:37:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 13:43:59 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Naja, schwupps, habe ich eine Klasse PersistentesArray von safeArray abgeleitet, die als zuätzliches Attribut einen Dateinamen als String hat und im Konstruktor die Datei liest und im Destruktor die Datei schreibt.</p>
</blockquote>
<p>Die Klasse hat also zwei Aufgaben, die nichts miteinander zu tun haben.</p>
</blockquote>
<p>Doch, die haben was mineinander zu tun.<br />
Aber die Eigentliche Arbeit wird in safeArray und fstream erledigt.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Erbe ich normalerweise nicht von Containern, weil sie normalerweise keinen virtuellen Destruktor haben oder ist es umgegehrt?</p>
</blockquote>
<p>Weil es überhaupt keinen Sinn ergibt. Das hat nichts mit Destruktoren zu tun.[/quote]<br />
Doch, auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2212250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212250</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 May 2012 13:43:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu STL und Iterator on Wed, 16 May 2012 14:10:03 GMT]]></title><description><![CDATA[<p>stl mal wieder schrieb:</p>
<blockquote>
<pre><code class="language-cpp">safeArray&amp; operator=(const safeArray&amp; rhs)    
    {
        safeArray temp(rhs);

        std::swap(m_array,temp.m_array);
        std::swap(m_count,temp.m_count);
        return *this;
    }
</code></pre>
</blockquote>
<p>Du kannst hier bei dem Copy-&amp;-Swap Trick noch eine ggf unnötige Kopie sparen, indem Du dem Compiler das Kopieren überlässt, der das ggf wegoptimiert:</p>
<pre><code>safeArray&amp; operator=([b]safeArray temp[/b])    
    {
        this-&gt;swap(temp); // ruhig auslagern, das swap    
        return *this;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2212264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2212264</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 16 May 2012 14:10:03 GMT</pubDate></item></channel></rss>