<?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[Copy Constructor und operator= ???]]></title><description><![CDATA[<p>Hallo <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>seit einiger Zeit beschaeftige ich mich wieder mal mit C++ und Gtkmm.<br />
Dabei hab ich bei der Implementierung von Copy Constructoren und den Zuweisungsoperator = .</p>
<p>Folgender Code:</p>
<pre><code class="language-cpp">#ifndef ENTRY_H
#define ENTRY_H

#include &lt;iostream&gt;
#include &lt;list&gt;
#include &lt;map&gt;
#include &lt;string&gt;

#include &lt;glibmm/ustring.h&gt;

class Entry : public std::map&lt;guint, Glib::ustring&gt;
{
        public:
                Entry();
                virtual ~Entry();

                Entry&amp; operator=(const Entry&amp; entry);
        protected:
        private:
};

class List : public std::list&lt;Entry&gt;
{
        public:
                List();
                List(const List&amp; list);
                virtual ~List();

        protected:
        private:
};

#endif
</code></pre>
<p>Dazu die kritischen Implementierungen:</p>
<pre><code class="language-cpp">Entry&amp; Entry::operator=(const Entry&amp; entry)
{
/*      if (this != &amp;entry)
        {
                for (Entry::iterator iter = entry.begin(); iter != entry.end(); iter++)
                {
                        gint first = (*iter).first;
                        Glib::ustring second = (*iter).second;
                        (*this)[first] = second;
                }
        } */

        Entry::iterator iter = entry.begin();

        return *this;
}

List::List(const List&amp; list)
{
        List::iterator iter = list.begin();
/*      for (List::iterator iter = list.begin(); iter != list.end(); iter++)
                ; */
}
</code></pre>
<p>Der Fehler lautet:</p>
<pre><code>list.cc: In member function 'Entry&amp; Entry::operator=(const Entry&amp;)':
list.cc:28: error: conversion from 'std::_Rb_tree_const_iterator&lt;std::pair&lt;const unsigned int, Glib::ustring&gt; &gt;' to non-scalar type 'std::_Rb_tree_iterator&lt;std::pair&lt;const unsigned int, Glib::ustring&gt; &gt;' requested
list.cc: In copy constructor 'List::List(const List&amp;)':
list.cc:40: error: conversion from 'std::_List_const_iterator&lt;Entry&gt;' to non-scalar type 'std::_List_iterator&lt;Entry&gt;' requested
</code></pre>
<p>Es scheint mit den Iteratoren bezueglich der Map und List zu sein, aber wieso?<br />
Warum aber? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/166067/copy-constructor-und-operator</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 05:27:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/166067.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 25 Nov 2006 19:41:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 19:42:21 GMT]]></title><description><![CDATA[<p>Hallo <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>seit einiger Zeit beschaeftige ich mich wieder mal mit C++ und Gtkmm.<br />
Dabei hab ich bei der Implementierung von Copy Constructoren und den Zuweisungsoperator = .</p>
<p>Folgender Code:</p>
<pre><code class="language-cpp">#ifndef ENTRY_H
#define ENTRY_H

#include &lt;iostream&gt;
#include &lt;list&gt;
#include &lt;map&gt;
#include &lt;string&gt;

#include &lt;glibmm/ustring.h&gt;

class Entry : public std::map&lt;guint, Glib::ustring&gt;
{
        public:
                Entry();
                virtual ~Entry();

                Entry&amp; operator=(const Entry&amp; entry);
        protected:
        private:
};

class List : public std::list&lt;Entry&gt;
{
        public:
                List();
                List(const List&amp; list);
                virtual ~List();

        protected:
        private:
};

#endif
</code></pre>
<p>Dazu die kritischen Implementierungen:</p>
<pre><code class="language-cpp">Entry&amp; Entry::operator=(const Entry&amp; entry)
{
/*      if (this != &amp;entry)
        {
                for (Entry::iterator iter = entry.begin(); iter != entry.end(); iter++)
                {
                        gint first = (*iter).first;
                        Glib::ustring second = (*iter).second;
                        (*this)[first] = second;
                }
        } */

        Entry::iterator iter = entry.begin();

        return *this;
}

List::List(const List&amp; list)
{
        List::iterator iter = list.begin();
/*      for (List::iterator iter = list.begin(); iter != list.end(); iter++)
                ; */
}
</code></pre>
<p>Der Fehler lautet:</p>
<pre><code>list.cc: In member function 'Entry&amp; Entry::operator=(const Entry&amp;)':
list.cc:28: error: conversion from 'std::_Rb_tree_const_iterator&lt;std::pair&lt;const unsigned int, Glib::ustring&gt; &gt;' to non-scalar type 'std::_Rb_tree_iterator&lt;std::pair&lt;const unsigned int, Glib::ustring&gt; &gt;' requested
list.cc: In copy constructor 'List::List(const List&amp;)':
list.cc:40: error: conversion from 'std::_List_const_iterator&lt;Entry&gt;' to non-scalar type 'std::_List_iterator&lt;Entry&gt;' requested
</code></pre>
<p>Es scheint mit den Iteratoren bezueglich der Map und List zu sein, aber wieso?<br />
Warum aber? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181426</guid><dc:creator><![CDATA[moe szyslak]]></dc:creator><pubDate>Sat, 25 Nov 2006 19:42:21 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 20:15:44 GMT]]></title><description><![CDATA[<p>Erstens sollte man von den STL-Container-Typen nicht ableiten und zweitens hast du ein const-Problem. Der Rückgabetyp der begin() Funnktion ist in diesem Fall kein iterator, sondern ein const_iterator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181438</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Sat, 25 Nov 2006 20:15:44 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 20:16:49 GMT]]></title><description><![CDATA[<p>Ja, der erwartet einen const_iterator statt eines iterator.<br />
Statt</p>
<pre><code class="language-cpp">Entry::iterator iter = entry.begin();
</code></pre>
<p>dies</p>
<pre><code class="language-cpp">Entry::const_iterator iter = entry.begin();
</code></pre>
<p>Greetz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181440</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Sat, 25 Nov 2006 20:16:49 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 20:27:57 GMT]]></title><description><![CDATA[<p>Mach aus deinem gesammten code folgendes:</p>
<pre><code class="language-cpp">typedef std::map&lt;guint, Glib::ustring&gt; Entry;
typedef std::list&lt;Entry&gt; List;
</code></pre>
<p>oder hat das in deinem Fall irgendwelche Nachteile?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181443</guid><dc:creator><![CDATA[Helium]]></dc:creator><pubDate>Sat, 25 Nov 2006 20:27:57 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 20:38:36 GMT]]></title><description><![CDATA[<p>Helium schrieb:</p>
<blockquote>
<p>Mach aus deinem gesammten code folgendes:</p>
<pre><code class="language-cpp">typedef std::map&lt;guint, Glib::ustring&gt; Entry;
typedef std::list&lt;Entry&gt; List;
</code></pre>
<p>oder hat das in deinem Fall irgendwelche Nachteile?</p>
</blockquote>
<p>Naja, das wuerde mit den angegebenen Kode ja gehen, aber ich hab mein Problem nur auf das Notwendige reduziert und das dann gepostet.</p>
<p>Aber ich werde mit das mit dem const_iterator anschaun.<br />
Aber wieso sollte man nicht von std container-typen nicht ableiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181447</guid><dc:creator><![CDATA[moe szyslak]]></dc:creator><pubDate>Sat, 25 Nov 2006 20:38:36 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 21:10:26 GMT]]></title><description><![CDATA[<p>Die Destruktoren der STL-Container sind nicht virtuell. Folglich ist zumindest public-Ableiten gefährlich (geht sofort schief, wenn du ein Objekt einer abgeleiteten Klasse über einen Basisklassenzeiger löschst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181457</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Sat, 25 Nov 2006 21:10:26 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 21:37:38 GMT]]></title><description><![CDATA[<p>Gibt es denn alternativen zu Map und List?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181467</guid><dc:creator><![CDATA[moe szyslak]]></dc:creator><pubDate>Sat, 25 Nov 2006 21:37:38 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 21:44:10 GMT]]></title><description><![CDATA[<p>Zu deinen Klassen Map und List? <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="😉"
    /> Ja, bestimmt.</p>
<p>Falls du std::map und std::list mit virtuellem Destruktor meinst, so lautet die Antwort nein. Und das ist gut so. Von einem Container abzuleiten deutet IMHO im Allgeminen auf einen fundamentalen Designfehler hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181469</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Sat, 25 Nov 2006 21:44:10 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 22:06:53 GMT]]></title><description><![CDATA[<p>Z2 schrieb:</p>
<blockquote>
<p>Zu deinen Klassen Map und List? <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="😉"
    /> Ja, bestimmt.</p>
<p>Falls du std::map und std::list mit virtuellem Destruktor meinst, so lautet die Antwort nein. Und das ist gut so. Von einem Container abzuleiten deutet IMHO im Allgeminen auf einen fundamentalen Designfehler hin.</p>
</blockquote>
<p>Designfehler - selbst nach 3 Jahren Studium hab ich davon noch nichts gehoert, aber vielleicht ist das ja in Java etwas anderes.</p>
<p>Sollte ich mir etwa die Funktionalitaet von List und Map selbst nachprogrammieren?<br />
Ich koennte natuerlich auch die boost-bibliothek verwenden, aber das moechte ich nicht unbedingt ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181475</guid><dc:creator><![CDATA[moe szyslak]]></dc:creator><pubDate>Sat, 25 Nov 2006 22:06:53 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 22:16:07 GMT]]></title><description><![CDATA[<p>Java != C++</p>
<p>Mit den OOP-Methoden aus Java kommst du in C++ gewöhnlich nicht sehr weit. Du sollst die Container natürlich nicht noch mal neu implementieren. Ich nehme an, der Unterschied zwischen einer ist-ein und einer hat-ein Relation ist dir wohl bekannt, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181476</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Sat, 25 Nov 2006 22:16:07 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 22:21:50 GMT]]></title><description><![CDATA[<p>Natuerlich, und die Klasse List soll auch eine Liste sein, die Liste soll als Attribut eine Map besitzen.<br />
in der Map sollen die IDs zu bestimmten eintraegen stehen, die Werte in der Klasse Entry (Map) spezifizieren.</p>
<p>Wie wuerdest du das denn planen, List als List mit attribut Map oder List als Map mit attribut list? So oder so, List als std::list wuerde mir vom Designstatus jedenfalls besser gefallen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181478</guid><dc:creator><![CDATA[moe szyslak]]></dc:creator><pubDate>Sat, 25 Nov 2006 22:21:50 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 22:28:14 GMT]]></title><description><![CDATA[<p>Bin mir jetzt nicht sicher, ob ich dich richtig verstanden habe. Deine Klasse besteht aus einer Liste und hat zusätzlich eine Map? In dem Fall sollte die Klasse sowohl die Liste als auch die Map als Attribut haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181481</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Sat, 25 Nov 2006 22:28:14 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 22:39:24 GMT]]></title><description><![CDATA[<p>Natuerlich waere das auch ne moeglichkeit, aber die liste soll durch die map nur spezialisiert und erweitert werden.</p>
<p>Dazu brauche ich keine Klasse die zwei Attribute verwaltet.</p>
<p>Seh ich das wirklich so falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181487</guid><dc:creator><![CDATA[moe szyslak]]></dc:creator><pubDate>Sat, 25 Nov 2006 22:39:24 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Constructor und operator= ??? on Sat, 25 Nov 2006 22:49:04 GMT]]></title><description><![CDATA[<p>IMHO, ja! Deine &quot;Liste&quot; ist eben keine Liste mehr. Eine Liste hat nämlich keine Map. Auch eine spezialisierte Liste hat keine Map.</p>
<p>Zu vererben nur weil man die Funktionalitäten der Oberklasse übernehmen will, ist normalerweise eine falsche Entscheidung (und wenn es noch so bequem ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1181490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1181490</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Sat, 25 Nov 2006 22:49:04 GMT</pubDate></item></channel></rss>