<?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[= Operator spinnt?]]></title><description><![CDATA[<p>Hallo allerseits <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>Ich habe eine variant-Klasse geschrieben, die ein beliebiges Objekt beinhalten kann. Ich kann allerdings u.a. das verhalten des = Operators nicht nachvollziehen. Wenn ich einem Variant-Objekt ein anderes Variant-Objekt zuweise, dann müsste doch das erste Objekt das ganze andere Objekt beinhalten und nicht nur dessen inhalt (in diesem Beispiel der String). Oder ist es ein Sonderfall weil es zwei Objekte vom selben Typ sind? Hat jemand eine Idee was da genau abgeht?</p>
<pre><code class="language-cpp">#ifndef VARIANT_H
#define VARIANT_H

#include &lt;cstdlib&gt;

class variant
{
    public:
        // constructor
        variant()
        {
            m_size = 0;
            m_data = NULL;
            }
        // initializer constructor
        template &lt;typename T&gt;
        variant(const T &amp;obj)
        {
            store(&amp;obj);
            }
        // copy constructor
        variant(const variant &amp;v)
        {
            m_size = v.m_size;
            free(m_data);
            m_data = malloc(m_size);
            memcpy(m_data, v.m_data, m_size);
            }
        // destructor
        virtual ~variant()
        {
            free(m_data);
            }
        // = operator
        template &lt;typename T&gt;
        variant&amp; operator = (const T &amp;obj)
        {
            store(&amp;obj);
            }
        // get object data
        template &lt;typename T&gt;
        T get()
        {
            return *((T*)m_data);
            }
        // get object size
        size_t size()
        {
            return m_size;
            }

    private:
        // store object in variant
        template&lt;typename T&gt;
        void store(const T *obj)
        {
            free(m_data);
            m_size = sizeof(T);
            m_data = malloc(m_size);
            memcpy(m_data, obj, m_size);
            }
        // object size    
        size_t  m_size;
        // object data
        void   *m_data;
    };

#endif
</code></pre>
<p>Das geht:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;variant.h&quot;

using namespace std;

int main(int argc, char *argv[])
{

    variant x = string(&quot;Hallo&quot;);
    variant y;

    y = x;

    cout &lt;&lt; y.get&lt;string&gt;() &lt;&lt; endl;

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
    }
</code></pre>
<p>Das geht nicht (crash), obwohl es meiner Meinung nach logischer wäre:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;variant.h&quot;

using namespace std;

int main(int argc, char *argv[])
{

    variant x = string(&quot;Hallo&quot;);
    variant y;

    y = x;

    cout &lt;&lt; (y.get&lt;variant&gt;()).get&lt;string&gt;() &lt;&lt; endl;

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/169875/operator-spinnt</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 00:05:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169875.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Jan 2007 19:50:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to = Operator spinnt? on Tue, 09 Jan 2007 19:50:19 GMT]]></title><description><![CDATA[<p>Hallo allerseits <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>Ich habe eine variant-Klasse geschrieben, die ein beliebiges Objekt beinhalten kann. Ich kann allerdings u.a. das verhalten des = Operators nicht nachvollziehen. Wenn ich einem Variant-Objekt ein anderes Variant-Objekt zuweise, dann müsste doch das erste Objekt das ganze andere Objekt beinhalten und nicht nur dessen inhalt (in diesem Beispiel der String). Oder ist es ein Sonderfall weil es zwei Objekte vom selben Typ sind? Hat jemand eine Idee was da genau abgeht?</p>
<pre><code class="language-cpp">#ifndef VARIANT_H
#define VARIANT_H

#include &lt;cstdlib&gt;

class variant
{
    public:
        // constructor
        variant()
        {
            m_size = 0;
            m_data = NULL;
            }
        // initializer constructor
        template &lt;typename T&gt;
        variant(const T &amp;obj)
        {
            store(&amp;obj);
            }
        // copy constructor
        variant(const variant &amp;v)
        {
            m_size = v.m_size;
            free(m_data);
            m_data = malloc(m_size);
            memcpy(m_data, v.m_data, m_size);
            }
        // destructor
        virtual ~variant()
        {
            free(m_data);
            }
        // = operator
        template &lt;typename T&gt;
        variant&amp; operator = (const T &amp;obj)
        {
            store(&amp;obj);
            }
        // get object data
        template &lt;typename T&gt;
        T get()
        {
            return *((T*)m_data);
            }
        // get object size
        size_t size()
        {
            return m_size;
            }

    private:
        // store object in variant
        template&lt;typename T&gt;
        void store(const T *obj)
        {
            free(m_data);
            m_size = sizeof(T);
            m_data = malloc(m_size);
            memcpy(m_data, obj, m_size);
            }
        // object size    
        size_t  m_size;
        // object data
        void   *m_data;
    };

#endif
</code></pre>
<p>Das geht:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;variant.h&quot;

using namespace std;

int main(int argc, char *argv[])
{

    variant x = string(&quot;Hallo&quot;);
    variant y;

    y = x;

    cout &lt;&lt; y.get&lt;string&gt;() &lt;&lt; endl;

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
    }
</code></pre>
<p>Das geht nicht (crash), obwohl es meiner Meinung nach logischer wäre:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;variant.h&quot;

using namespace std;

int main(int argc, char *argv[])
{

    variant x = string(&quot;Hallo&quot;);
    variant y;

    y = x;

    cout &lt;&lt; (y.get&lt;variant&gt;()).get&lt;string&gt;() &lt;&lt; endl;

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1206550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206550</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 09 Jan 2007 19:50:19 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator spinnt? on Tue, 09 Jan 2007 19:56:46 GMT]]></title><description><![CDATA[<p>malloc -&gt; nur PODs</p>
<p>hab gar nicht weitergelesen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206558</guid><dc:creator><![CDATA[Entenwickler]]></dc:creator><pubDate>Tue, 09 Jan 2007 19:56:46 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator spinnt? on Tue, 09 Jan 2007 20:00:33 GMT]]></title><description><![CDATA[<p>Ein Templateoperator ist <em>niemals</em> ein Copyzuweisungsoperator und ein Templatekonstruktor <em>niemals</em> ein Copykonstruktor. Diese werden implizit durch den Compiler deklariert (da du es nicht tust) und dann entsprechend aufgerufen. Man könnte auch sagen, der erste Satz folgt aus dem Zweiten, aber oft lässt man den letzten Teil auch weg und dann sieht das plötzlich wie eine besondere Regel aus, obwohl es eigentlich keine ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206559</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 09 Jan 2007 20:00:33 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator spinnt? on Tue, 09 Jan 2007 20:40:06 GMT]]></title><description><![CDATA[<p>Wenn ich die beiden folgenden methoden definiere:</p>
<ol>
<li></li>
</ol>
<pre><code class="language-cpp">template &lt;typename T&gt;
variant&amp; operator = (const T &amp;obj)
</code></pre>
<ol start="2">
<li></li>
</ol>
<pre><code class="language-cpp">variant&amp; operator = (const variant &amp;v)
</code></pre>
<p>Kann ich dann davon ausgehen, dass 1. immer dann verwendet wird, wenn 2. nicht geht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206613</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 09 Jan 2007 20:40:06 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator spinnt? on Tue, 09 Jan 2007 20:52:13 GMT]]></title><description><![CDATA[<p>Du solltest weiterhin die Selbstzuweisung mit:</p>
<pre><code class="language-cpp">if(this != &amp;obj)
</code></pre>
<p>ausschließen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206624</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Tue, 09 Jan 2007 20:52:13 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator spinnt? on Wed, 10 Jan 2007 16:19:47 GMT]]></title><description><![CDATA[<p>Eigentlich braucht er das nicht, sofern die Logik korrekt ist. Was allerdings nicht der Fall ist. Das würde ich eher ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207245</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 10 Jan 2007 16:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator spinnt? on Thu, 11 Jan 2007 10:34:32 GMT]]></title><description><![CDATA[<p>Zumindests beim Zuweisungsoperator fehlt ein &quot;return *this;&quot; ...<br />
Daher kann die Zuweisung &quot;y = x;&quot; nur Müll ausgeben.</p>
<p>(Falls das überhaupt so kompiliert!)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1207749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207749</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Thu, 11 Jan 2007 10:34:32 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator spinnt? on Thu, 11 Jan 2007 12:09:21 GMT]]></title><description><![CDATA[<p>Langsam geht mir auf, dass meine Klasse ziemlicher Müll 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 />
Ich kann ja mit sizeof gar nicht die korrekte Objektgrösse ermitteln. Ich müsste die Objekte jeweils mit new duplizieren. Da aber die daten in einem void-Pointer gespeichert werden, kann ich den Speicher nicht mit delete freigeben. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1207834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1207834</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 11 Jan 2007 12:09:21 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator spinnt? on Fri, 12 Jan 2007 09:39:44 GMT]]></title><description><![CDATA[<p>Deine Klasse funktioniert - zumindest solange du sie nur mit PODs füllst (POD=Plain Old Data - das sind vereinfacht ausgedrückt Datentypen, die auch in C vorkommen könnten). Wenn du mit vollwertigen C++ Klassen arbeiten willst, hast du schon ein Problem - du kannst mit deinem Ansatz nicht feststellen, welchen Datentyp du in deinem variant gespeichert hast, aber du brauchst diesen Typ, um deine Daten korrekt zu kopieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208503</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 12 Jan 2007 09:39:44 GMT</pubDate></item></channel></rss>