<?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[BigThree Problem]]></title><description><![CDATA[<p>Kann mir bitte jemand den AssignmentOp und den CopyCtor von Container so implementieren, dass folgendes Programm funzt? Ich stehe im Moment etwas auf dem Schlauch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class ABC
{
public:
    virtual void func()=0;
};

class Foo : public ABC
{
public:
    void func()
    {
        cout &lt;&lt; &quot;Ich bin func aus Foo\n&quot;;
    }
};

class Bar : public ABC
{
public:
    void func()
    {
        cout &lt;&lt; &quot;Ich bin func aus Bar\n&quot;;
    }
};

template&lt;typename T&gt;
class Container
{
private:
    T* matrix_[2];  

public:

    Container(ABC* first, ABC* second)
    {
        matrix_[0]=first;
        matrix_[1]=second;
    }

    ~Container()
    {
        delete matrix_[0];
        delete matrix_[1];
    }

    Container(const Container&lt;T&gt;&amp; c)
    {
        //wie implementieren?
    }

    Container operator=(const Container&lt;T&gt;&amp; c)
    {
        //wie implementieren?
        return *this;
    }
};

int main()
{    
    Container&lt;ABC&gt; a(new Foo(), new Bar()),
              b(new Bar(), NULL),
              c(a);

    a=b;

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/117228/bigthree-problem</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 03:41:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/117228.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Aug 2005 15:02:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to BigThree Problem on Thu, 04 Aug 2005 15:54:58 GMT]]></title><description><![CDATA[<p>Kann mir bitte jemand den AssignmentOp und den CopyCtor von Container so implementieren, dass folgendes Programm funzt? Ich stehe im Moment etwas auf dem Schlauch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class ABC
{
public:
    virtual void func()=0;
};

class Foo : public ABC
{
public:
    void func()
    {
        cout &lt;&lt; &quot;Ich bin func aus Foo\n&quot;;
    }
};

class Bar : public ABC
{
public:
    void func()
    {
        cout &lt;&lt; &quot;Ich bin func aus Bar\n&quot;;
    }
};

template&lt;typename T&gt;
class Container
{
private:
    T* matrix_[2];  

public:

    Container(ABC* first, ABC* second)
    {
        matrix_[0]=first;
        matrix_[1]=second;
    }

    ~Container()
    {
        delete matrix_[0];
        delete matrix_[1];
    }

    Container(const Container&lt;T&gt;&amp; c)
    {
        //wie implementieren?
    }

    Container operator=(const Container&lt;T&gt;&amp; c)
    {
        //wie implementieren?
        return *this;
    }
};

int main()
{    
    Container&lt;ABC&gt; a(new Foo(), new Bar()),
              b(new Bar(), NULL),
              c(a);

    a=b;

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/845790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845790</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Thu, 04 Aug 2005 15:54:58 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Thu, 04 Aug 2005 15:11:06 GMT]]></title><description><![CDATA[<p>1. nutzt du das template nicht, sondern codest den typ ABC fest rein.<br />
2. geht das?: matrix_[2] ????</p>
<p>Zuweisungoperator:</p>
<p>void oparator=(Container&lt;T&gt; ziel, Container&lt;&gt; quelle)<br />
{<br />
ziel.getMatrix() = quelle.getMAtrix();<br />
//muss natürlich für jeden wieder überladen werden<br />
//und getMAtrix muss ne REferenz zurückgeben, weil es ja private is</p>
<p>etc....<br />
}</p>
<p>jedenfalls vom prinzip her......</p>
]]></description><link>https://www.c-plusplus.net/forum/post/845802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845802</guid><dc:creator><![CDATA[dev_MAddoX]]></dc:creator><pubDate>Thu, 04 Aug 2005 15:11:06 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Thu, 04 Aug 2005 16:15:00 GMT]]></title><description><![CDATA[<p>dev_MAddoX schrieb:</p>
<blockquote>
<p>1. nutzt du das template nicht, sondern codest den typ ABC fest rein.</p>
</blockquote>
<p>Hast natuerlich recht. Ich meine natuerlich</p>
<pre><code class="language-cpp">T* matrix_[2];
</code></pre>
<p>dev_MAddoX schrieb:</p>
<blockquote>
<p>2. geht das?: matrix_[2] ????</p>
</blockquote>
<p>warum sollte es nicht?</p>
<p>dev_MAddoX schrieb:</p>
<blockquote>
<p>Zuweisungoperator:</p>
<pre><code class="language-cpp">void oparator=(Container&lt;T&gt; ziel, Container&lt;&gt; quelle)
</code></pre>
</blockquote>
<p>Was soll das denn?<br />
Ich will den operator= doch nicht als friend function implementieren.</p>
<p>dev_MAddoX schrieb:</p>
<blockquote>
<pre><code class="language-cpp">ziel.getMatrix() = quelle.getMAtrix();
</code></pre>
</blockquote>
<p>Dann wuerde ich nur die Zeiger kopieren und nicht die Objekte.<br />
Aber genau das ist mein Problem, die Matrix zu kopieren.<br />
Ich haette gerne sowas gemacht:</p>
<pre><code class="language-cpp">Container operator=(const Container&lt;T&gt;&amp; c)
    {
        if(this == &amp;c) return;

        for(int i=0; i&lt;2; ++i)
            delete matrix_[i];

        for(int i=0; i&lt;2; ++i)
            if(c.matrix[i] == NULL)
                this-&gt;matrix_[i] = NULL;            
            else
                this-&gt;matrix_[i] = new T(c.matrix_[i]);
        return *this;
    }
</code></pre>
<p>Haette glaube ich auch hingehaun(haette es??), waere die Klasse nicht generisch.<br />
Weil ich sie aber mit dem Typ ABC parametrisiert habe(der ja abstrakt ist) funktioniert new T(c.matrix_[i]); schon mal gar nicht.<br />
Hat jemand schonmal sowas gehabt?</p>
<p>thx in advance</p>
]]></description><link>https://www.c-plusplus.net/forum/post/845864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845864</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Thu, 04 Aug 2005 16:15:00 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Thu, 04 Aug 2005 16:37:41 GMT]]></title><description><![CDATA[<p>Wie kommst du eigentlich darauf dass du dich darum kümmern müsstest ?</p>
<p>Der typ sollte einen vernünftigen assignment-op und copyctor implementieren und dann kannst die benutzen.</p>
<pre><code class="language-cpp">const Container &amp;operator=(const Container&lt;T&gt;&amp; c)
    {
        if(this == &amp;c) return;

        *matrix_[0]=c.get_matrix1();  //op= des enthaltenen typen
        *matrix_[1]=c.get_matrix2(); 

        return *this;
    }
</code></pre>
<p>Für den copy-ctor genau so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/845878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845878</guid><dc:creator><![CDATA[KurzeFrage]]></dc:creator><pubDate>Thu, 04 Aug 2005 16:37:41 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Thu, 04 Aug 2005 16:39:19 GMT]]></title><description><![CDATA[<p>Argh...</p>
<p>musst natürlich noch dereferenzieren.</p>
<pre><code>const Container &amp;operator=(const Container&lt;T&gt;&amp; c)
    {
        if(this == &amp;c) return;

        *matrix_[0]=*c.get_matrix1();  //op= des enthaltenen typen
        *matrix_[1]=*c.get_matrix2();

        return *this;
    }
</code></pre>
<p>überseh ich jetzt was wesentliches ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/845880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845880</guid><dc:creator><![CDATA[KurzeFrage]]></dc:creator><pubDate>Thu, 04 Aug 2005 16:39:19 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Thu, 04 Aug 2005 16:52:24 GMT]]></title><description><![CDATA[<p>KurzeFrage schrieb:</p>
<blockquote>
<p>Argh...</p>
<p>musst natürlich noch dereferenzieren.</p>
<pre><code class="language-cpp">const Container &amp;operator=(const Container&lt;T&gt;&amp; c)
    {
        if(this == &amp;c) return;
       
        *matrix_[0]=*c.get_matrix1();  //op= des enthaltenen typen
        *matrix_[1]=*c.get_matrix2();

        return *this;
    }
</code></pre>
<p>überseh ich jetzt was wesentliches ?</p>
</blockquote>
<p>IMHO schon.<br />
Was passiert mit den vorherigen Elementen der Matrix?</p>
<pre><code class="language-cpp">*matrix_[0]=*c.get_matrix1();  //op= des enthaltenen typen
</code></pre>
<p>Was ist nun mit dem Element, das vorher an *matrix_[0] stand?<br />
Du hast es nicht deleted, also hast du nun ein schoenes memory leak.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/845890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845890</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Thu, 04 Aug 2005 16:52:24 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Thu, 04 Aug 2005 16:56:48 GMT]]></title><description><![CDATA[<p>Nein hat er nicht, die bekommen neue werte.</p>
<p>Er kopiert keinen speicherbereich sondern , weisst die klasse(ABC in diesem fall) an die werte zuzuweisen. Was ja auch richtig ist weil nur sie weiss wie man das am besten macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/845893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845893</guid><dc:creator><![CDATA[prolog]]></dc:creator><pubDate>Thu, 04 Aug 2005 16:56:48 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Thu, 04 Aug 2005 17:32:45 GMT]]></title><description><![CDATA[<p>Einverstanden.<br />
Ich habe aber unter meinen Elementen auch NULL Pointer.<br />
Ich behandele diese wie folgt:</p>
<pre><code class="language-cpp">Container operator=(const Container&lt;T&gt;&amp; c)
    {
        if(this != &amp;c)
        {   
            for(int i=0; i&lt;2; ++i)
                if(c.matrix_[i] == NULL) 
                {
                    delete this-&gt;matrix_[i];
                    this-&gt;matrix_[i] = NULL;
                }            
                else
                {
                    //Wer sagt mir, dass *this-&gt;matrix_[i] != NULL ist?
                    *this-&gt;matrix_[i] = *c.matrix_[i];
                }           
        }
        return *this;
    }
</code></pre>
<p>Falls mir ein NULL Pointer beim kopieren von einem Containerobjekt A unterkommt, delete ich das Element und setze es auf NULL. Wenn nun auf A erneut der operator= aufgerufen wird, dann schlaegt folgende Anweisung fehl:</p>
<pre><code class="language-cpp">//Wer sagt mir, dass *this-&gt;matrix_[i] != NULL ist?
                    *this-&gt;matrix_[i] = *c.matrix_[i];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/845922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845922</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Thu, 04 Aug 2005 17:32:45 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Thu, 04 Aug 2005 17:41:39 GMT]]></title><description><![CDATA[<p>Du könntest einfach testen ob es NULL ist. Da du ja sowieso das element löschen würdest in diesem fall, machst du einfach nichts mit diesem element oder wäre das nicht im sinne des erfinders ?</p>
<p>//EDIT NOCHMAL ... machst du doch nicht, bleibt dir in diesem fall also nichts übrig als nochmal zu testen, dann würdest du eben ein neues element anlegen müssen, dafür könntest zum beispiel den copy-ctor der klasse benutzen.</p>
<pre><code class="language-cpp">if(matrix[i]==NULL)
     matrix[i]=new T(*c.matrix[i]);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/845925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845925</guid><dc:creator><![CDATA[prolog]]></dc:creator><pubDate>Thu, 04 Aug 2005 17:41:39 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Thu, 04 Aug 2005 17:53:47 GMT]]></title><description><![CDATA[<p>Und schon waeren wir beim Ausgangsproblem.</p>
<blockquote>
<p>Weil ich sie aber mit dem Typ ABC parametrisiert habe(der ja abstrakt ist) funktioniert new T(c.matrix_[i]); schon mal gar nicht.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/845940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845940</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Thu, 04 Aug 2005 17:53:47 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Thu, 04 Aug 2005 17:56:38 GMT]]></title><description><![CDATA[<p>Dann musst du einen weg finden dass keine NULL-pointer auftauchen. Das ist ja normalerweise auch eine ausnahme und ich würde da eine exception werfen. Möglich wäre doch zum beispiel einen leeren typ zu definieren oder sowas. Sodass du imma mit validen objekten arbeitest, die eben nur nicht notwendigerweise imma auch definierte werte haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/845942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845942</guid><dc:creator><![CDATA[prolog]]></dc:creator><pubDate>Thu, 04 Aug 2005 17:56:38 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Thu, 04 Aug 2005 18:35:37 GMT]]></title><description><![CDATA[<blockquote>
<p>Dann musst du einen weg finden dass keine NULL-pointer auftauchen.</p>
</blockquote>
<p>Finde ich keine befriedigende Loesung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Die NULL Pointer brauche ich, um zu erkennen, ob das Feld meiner Matrix leer ist.<br />
Und immer ein Test mit instanceof find ich auch nicht gut, wenn ich einen leeren Typ anlege.</p>
<p>Das new Problem(matrix[i]=new T(*c.matrix[i]);) wuerde sowieso spaetestens im CopyCtor erneut auftreten, weil ich da auf jeden Fall Speicher anfordern muss.</p>
<pre><code class="language-cpp">Container(const Container&lt;T&gt;&amp; c) 
{ 
    for(int i=0; i&lt;2; ++i) 
        this-&gt;matrix_[i] = new T(c.matrix_[i]);
}
</code></pre>
<p>Angenommen, ich liesse mich auf deinen Vorschlag ein, dann gaebe es aber noch folgendes Problem:</p>
<pre><code class="language-cpp">*this-&gt;matrix_[i] = *c.matrix_[i];
</code></pre>
<p>Diese Technik called immer den operator= von T, also von ABC.<br />
Um dieses Problem zu loesen muesste ich den operator= in ABC virtual definieren.<br />
Das zoege nach sich, dass alle Klassen in meinem Vererbungsgraphen zuweisungskompatible zueinander sind.<br />
Sowas waere also Problemlos moeglich:</p>
<pre><code class="language-cpp">class ABC
{
public:
    virtual ABC&amp; operator=(const ABC&amp;){}
};

class KlasseA_dieNichtsMit_B_zuTunHat : public ABC
{
public:
    KlasseA_dieNichtsMit_B_zuTunHat operator=(const KlasseA_dieNichtsMit_B_zuTunHat&amp; A)
    {
        ABC::operator=(A);
    }
};

class KlasseB_dieNichtsMit_A_zuTunHat : public ABC
{
public:
    KlasseB_dieNichtsMit_A_zuTunHat operator=(const KlasseB_dieNichtsMit_A_zuTunHat&amp; B)
    {
        ABC::operator=(B);
    }
};

void sample(ABC&amp; a, ABC&amp; b)
{ a=b;   //unsinnig, aber leider erlaubt }

int main()
{
    KlasseA_dieNichtsMit_B_zuTunHat A;
    KlasseA_dieNichtsMit_B_zuTunHat B;
    sample(A,B);
}
</code></pre>
<p>Durch die Namen angedeutet, kann man erkennen, dass KlasseA_dieNichtsMit_B_zuTunHat<br />
und KlasseA_dieNichtsMit_B_zuTunHat nichts miteinander zu tun haben, ausser eine gemeinsame ABC. Trotzdem koennte ich sie einander zuweisen.<br />
In den Klassen meiner Vererbungshierarchie existiert eigentlich kein solcher Isomorphismus, dass ich so etwas wollte. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/845969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845969</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Thu, 04 Aug 2005 18:35:37 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Fri, 05 Aug 2005 21:23:00 GMT]]></title><description><![CDATA[<p>Hmm ich versteh das problem ehrlich gesagt nicht.</p>
<p>Im copy-ctor kann man locker mit dem blosen assignment-op der enthaltenen klasse arbeiten. Die erzeugung der objekte wäre dann auch wieder nicht deine aufgaben. Da wäre dann ein</p>
<pre><code class="language-cpp">container.insert(new derived());
</code></pre>
<p>angebracht.</p>
<p>Und naja ein container soll ja wenn er was enthält auch was enthalten was sinnvoll ist, darum geht es doch gerade. Ich versteh auch nicht warum die beiden abgeleiteten klassen, wenn sie nichts miteinander zu tun haben, dann von der selben basisklasse erben. In diesem moment haben sie was gemeinsam, nämlich die basis. Wenn du das nicht willst dann musst du deinem container eben sagen dass er nicht container der basisklasse ist sondern jeweils einen container für die abgeleiteten klassen instanzieren.</p>
<pre><code class="language-cpp">class A{

};

class B : public A{

};

class C : public A{

};

container&lt;A*&gt; container_A_;
container&lt;B*&gt; container_B_;
container&lt;C*&gt; container_C_;

container_A_.insert(new B());
container_A_.insert(new C());

container_B_.insert(new B());
container_C_.insert(new C());

//conatainer_B_=container_C_  schlaegt dann fehl
</code></pre>
<p>Oder überseh ich wieder was ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/846795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846795</guid><dc:creator><![CDATA[prolog]]></dc:creator><pubDate>Fri, 05 Aug 2005 21:23:00 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Fri, 05 Aug 2005 21:55:17 GMT]]></title><description><![CDATA[<p>prolog schrieb:</p>
<blockquote>
<p>Hmm ich versteh das problem ehrlich gesagt nicht.</p>
<p>Im copy-ctor kann man locker mit dem blosen assignment-op der enthaltenen klasse arbeiten.</p>
</blockquote>
<p>ohne vorher speicher zu allozieren? das wuerde mich sehr wundern, nachdem man mir <a href="http://c-plusplus.net/forum/viewtopic-var-t-is-113626-and-highlight-is-.html" rel="nofollow">hier</a> versicherte genau das tun zu muessen.</p>
<blockquote>
<p>Die erzeugung der objekte wäre dann auch wieder nicht deine aufgaben. Da wäre dann ein</p>
<pre><code class="language-cpp">container.insert(new derived());
</code></pre>
</blockquote>
<p>Sicher, das wuerde das Problem loesen, wenn ich wuesste, dass ich wirklich gerade ein derived kopiere und nicht ein anderes von ABC abgeleitetes Objekt derived2.<br />
Leider weiss ich aber nicht, welche Instanz ich von meinen 12 von ABC abgeleiteten Klassen gerade kopiere. D.h. es muesste ein Typtest her und der ist ganz sicher nicht im Sinne des Erfinders.</p>
<pre><code class="language-cpp">class ABC;
class A : public ABC { /* blablabla */ };
class B : public ABC { /* */};
class C : public ABC...
class D....
...

class Container //enthaelt ABC Objekte
Container(const Container&amp; c)
{
    for(int i=0; i&lt;1000; ++i)            
        if(c.matrix_[i] instanceof A)
            this-&gt;matrix_[i] = new A(c.matrix_[i]);
        else if(c.matrix_[i] instanceof B)
            this-&gt;matrix_[i] = new B(c.matrix_[i]);
        else if(c.matrix_[i] instanceof C)
            this-&gt;matrix_[i] = new C(c.matrix_[i]);
        else if(c.matrix_[i] instanceof D)
            this-&gt;matrix_[i] = new D(c.matrix_[i]);
        //und so weiter...

        //ich kann keine Typen nachtraeglich hinzufuegen, ohne eine weitere Verzweigung hinzuzufuegen.
        //gaaanz schlecht!!
}
};
</code></pre>
<blockquote>
<p>Ich versteh auch nicht warum die beiden abgeleiteten klassen, wenn sie nichts miteinander zu tun haben, dann von der selben basisklasse erben. In diesem moment haben sie was gemeinsam, nämlich die basis.</p>
</blockquote>
<p>Nur die Basis. Das heisst noch lange nicht, dass sie den selbem abstrakten Status haben, der fuer einen virtuellen assingnmentOp notwendig waere. Nur weil mehrere Klassen von derselben ABC erben, will ich doch noch lange nicht, dass man sie alle einander gegenseitig zuweisen kann</p>
<pre><code class="language-cpp">class Shape
{
protected:
    int x,y;
};

class Square : public Shape { };
class Circle : public Shape { };

void sample(Shape&amp; a, Shape&amp; b)
{ a=b; }

int main()
{
    Square a;
    Circle b;
    sample(a,b); // vollkommen unsinnig!!!
}
</code></pre>
<p>Vielleicht verstehe ich dich auch nicht, dann koenntest du dich ja an dem Codefragment probieren, dass ich anfangs gepostet hatte. Waere gespannt auf deine Loesung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/846810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846810</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Fri, 05 Aug 2005 21:55:17 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Fri, 05 Aug 2005 22:07:12 GMT]]></title><description><![CDATA[<p>Gehört TGGC eigentlich auch zu den Big Three?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/846813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846813</guid><dc:creator><![CDATA[naaa]]></dc:creator><pubDate>Fri, 05 Aug 2005 22:07:12 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Fri, 05 Aug 2005 22:41:32 GMT]]></title><description><![CDATA[<p>naaa schrieb:</p>
<blockquote>
<p>Gehört TGGC eigentlich auch zu den Big Three?</p>
</blockquote>
<p>Nein, dafür ist er zu schlecht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/846819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846819</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Fri, 05 Aug 2005 22:41:32 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Fri, 05 Aug 2005 22:45:49 GMT]]></title><description><![CDATA[<p>ich denke mal HumeSikkins und volkard gehören auf jeden Fall dazu. Aber wer noch? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/846822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846822</guid><dc:creator><![CDATA[big three]]></dc:creator><pubDate>Fri, 05 Aug 2005 22:45:49 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Sat, 06 Aug 2005 00:05:49 GMT]]></title><description><![CDATA[<p>och leute....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/846838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846838</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Sat, 06 Aug 2005 00:05:49 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Sat, 06 Aug 2005 11:21:31 GMT]]></title><description><![CDATA[<p>Ok, also wenn du weisst dass du nur abgeleitete klassen verwalten musst dann brauchst du keine templates. Du arbeitest eben mit den basisklassenzeigern.</p>
<p>Dass man keine instanz einer abstracten klass erzeugen kann liegt in der natur der c++-dinge, da wirst du nichts dran drehen können. Was du willst ist offensichtlich eine deep-copy-semantic beim op= und copy-ctor. Gut dann musst<br />
du aber dafür sorgen dass du nie mit null-pointern zu tun hast. Weil sonst immer das problem mit der instanzierung der basis auftritt. Der container ist nicht für allocierung bzw. deallocierung verantwortlich. Wenn der container leer ist enthält er kein objekt, wenn er die größe 1 hat dann enthält er eben ein definiertes objekt. Es ist aufgabe des clients dafür zu sorgen dass da ordentliche werte vorhanden sind um damit arbeiten zu können wie ers erwartet.</p>
<p>Kannst du mal sagen warum du diesen weg überhaupt gehst mit dem eigenen container ? Ich meine einen groben umriss des kontexts geben, dass man mal schaun kann ob das nicht auch anders geht ?</p>
<p>Ich würde wahrscheinlich boost::array &lt;basis*&gt; verwenden. Aber es kann ja sein dass das für dich nich ausreicht weil du noch irgendwas besonderes machen willst. Aber vom jetzigen standpunkt aus verschliesst sich mir irgendwie der sinn des ganzen.</p>
<p>Ansonsten kannst du auch einfach ne shallow-copy der zeiger machen, musst halt nur drauf achten dass die zeiger nicht ausversehen durch einen andren container zerstört werden. Deswegen sollte der container auch die elemente nicht im dtor oder ähnliches freigeben. Dafür ist auch der client verantwortlich.</p>
<p>Sry nochmal, das muss frustrierend für dich sein aber probiers doch nochmal genau zu schildern bitte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/846933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846933</guid><dc:creator><![CDATA[prolog]]></dc:creator><pubDate>Sat, 06 Aug 2005 11:21:31 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Sat, 06 Aug 2005 11:39:47 GMT]]></title><description><![CDATA[<p>big three schrieb:</p>
<blockquote>
<p>ich denke mal HumeSikkins und volkard gehören auf jeden Fall dazu. Aber wer noch? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>TGGC <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/846943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846943</guid><dc:creator><![CDATA[wunderbar]]></dc:creator><pubDate>Sat, 06 Aug 2005 11:39:47 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Sat, 06 Aug 2005 12:46:12 GMT]]></title><description><![CDATA[<blockquote>
<p>Ok, also wenn du weisst dass du nur abgeleitete klassen verwalten musst dann brauchst du keine templates. Du arbeitest eben mit den basisklassenzeigern.</p>
</blockquote>
<p>Gut, dann werde ich meine Klasse ungenerisch machen.</p>
<blockquote>
<p>Dass man keine instanz einer abstracten klass erzeugen kann liegt in der natur der c++-dinge, da wirst du nichts dran drehen können. Was du willst ist offensichtlich eine deep-copy-semantic beim op= und copy-ctor.</p>
</blockquote>
<p>Ja <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>
<blockquote>
<p>Gut dann musst<br />
du aber dafür sorgen dass du nie mit null-pointern zu tun hast. Weil sonst immer das problem mit der instanzierung der basis auftritt</p>
</blockquote>
<p>Ich brauchte halt einen Wert, der mir signalisiert, dass in einem Feld kein ABC Objekt vorhanden ist. Der NULL Pointer bot sich IMHO dafuer an.</p>
<blockquote>
<p>Der container ist nicht für allocierung bzw. deallocierung verantwortlich.</p>
</blockquote>
<p>Wie jetzt? Wer dann? Ich wuesste nicht, wie ich beim CopyCtor um eine Allokation herumkommen koennte.</p>
<blockquote>
<p>Kannst du mal sagen warum du diesen weg überhaupt gehst mit dem eigenen container ? Ich meine einen groben umriss des kontexts geben, dass man mal schaun kann ob das nicht auch anders geht ?</p>
</blockquote>
<p>Ich brauchte einige spezielle member functions, die kein std container bereitstellt. Meine Container Klasse ist auch nur ganz kurz und <em>eigentlich</em> <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="😉"
    /> recht simpel.</p>
<p>Es geht mir im Moment nicht so sehr darum, dass ich ja viel einfacher eine bereits fertige Containerklasse verwenden koennte.<br />
Das eigentliche Problem liegt darin: Ich habe eine Klasse, die ein Attribut vom Typ Zeiger auf ABC hat. Ich habe mich jetzt gefragt, wie ich den CopyCtor und den AssignmentOp zu implementieren habe, um das Attribut zu kopieren, ohne seinen genauen Typ zu wissen(weil ich ja 12 Unterklassen habe) und dabei noch die NULL Pointer angemessen behandeln zu koennen.<br />
std::vector etc koennen das doch auch! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Wie machen die das denn?<br />
Mir kommt das Problemm so alltaeglich vor!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/846973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846973</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Sat, 06 Aug 2005 12:46:12 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Sat, 06 Aug 2005 23:33:05 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wenn ich micht nicht irre passiert bei vectoren von zeigern auch keine tiefe copie. AFAIK werden da nur zeiger kopiert. Deswegen kann der das. Aber das ist ja nicht was du willst. Weil eine veränderung eines elements im einen container eine änderung desselben elements im andren container nach sich ziehen würde.</p>
<p>Ich hab allerdings jetzt auch nicht nachgesehen, also wenn das nicht stimmen sollte möge man mich korrigieren.</p>
<p>Aber eins scheint mir sicher, du kannst keine instanz der basis erzeugen um dann evtl. danach die ableitete klasse tief reinzukopieren. Das musst du irgendwie umgehen.</p>
<p>Man könnte ja zum beispiel sowas überlegen.</p>
<pre><code class="language-cpp">class base{
     public:
        explicit base(const bool c=false):concrete_(c){}
        virtual ~base(){}
        virtual void func()=0;
        void concrete(const bool &amp;n){concrete_=n;}
        const bool &amp;concrete() const {return conctrete_;}
    private:
        bool concrete_;
};

class derived : public base{
      public:
          derived(const int v,const int v2) : base(true),v1_(v),v2_(v2) {}
          void func(){}
      private:
          int v1_;
          int v2_;
};
</code></pre>
<p>Dann könntest du mit zeigern und tiefen copien in deinem container arbeiten. Und wenn du die werte brauchst müsstest du vorher testen ob concrete true ist oder nicht und entsprechend im einen fall von unsinn ausgehen und im andren von sinnvollen werten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/846983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846983</guid><dc:creator><![CDATA[prolog]]></dc:creator><pubDate>Sat, 06 Aug 2005 23:33:05 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Sat, 06 Aug 2005 13:33:53 GMT]]></title><description><![CDATA[<p>An einen capability query hatte ich auch schon gedacht. Koennte ich mal probieren.</p>
<p>Falls die Standard Container alle nur triviale CopyCtors und AssignmentOps haben, dann wundert mich gar nichts mehr. Dann ist das ja kein Problem <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 />
Ich haette aber nicht gedacht, dass mein Problem doch so subtil ist.</p>
<p>Ich werde da noch n bisschen rumgruebeln...<br />
Dank dir vielmals fuer deine Muehe! thx.</p>
<p>@all: so, jetzt koennt ihr weiter ausdiskutieren, wer der dritte unter den BigThree ist <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/846985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846985</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Sat, 06 Aug 2005 13:33:53 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Sat, 06 Aug 2005 13:46:54 GMT]]></title><description><![CDATA[<p>und deinen clients einen virtuellen konstruktor aufzwingen willst du auch nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/846993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846993</guid><dc:creator><![CDATA[std. proposal]]></dc:creator><pubDate>Sat, 06 Aug 2005 13:46:54 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Sat, 06 Aug 2005 13:56:29 GMT]]></title><description><![CDATA[<p>Werner Salomon ist der Dritte! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/847002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/847002</guid><dc:creator><![CDATA[all]]></dc:creator><pubDate>Sat, 06 Aug 2005 13:56:29 GMT</pubDate></item><item><title><![CDATA[Reply to BigThree Problem on Sat, 06 Aug 2005 14:21:16 GMT]]></title><description><![CDATA[<p>Ich hab gerade mal nachgesehen.</p>
<p>copy-ctor meiner vector-implementierung:</p>
<pre><code class="language-cpp">/**
       *  @brief  %Vector copy constructor.
       *  @param  x  A %vector of identical element and allocator types.
       * 
       *  The newly-created %vector uses a copy of the allocation
       *  object used by @a x.  All the elements of @a x are copied,
       *  but any extra memory in
       *  @a x (for fast expansion) will not be copied.
       */
      vector(const vector&amp; __x)
      : _Base(__x.size(), __x.get_allocator())
      { _M_finish = uninitialized_copy(__x.begin(), __x.end(), _M_start); }
</code></pre>
<p>Da werden so wie ich das sehe auch nur zeiger kopiert.</p>
<p>uninitialized_copy würde in deinem fall so aussehen, da du ja mit zeigern also POD-typen arbeitest.</p>
<pre><code class="language-cpp">template&lt;typename _InputIter, typename _ForwardIter&gt;
    inline _ForwardIter 
    __uninitialized_copy_aux(_InputIter __first, _InputIter __last,
			     _ForwardIter __result,
			     __true_type)
    { return copy(__first, __last, __result); }

template&lt;typename _InputIter, typename _ForwardIter&gt;
    inline _ForwardIter
    uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result)
    {
      typedef typename iterator_traits&lt;_ForwardIter&gt;::value_type _ValueType;
      typedef typename __type_traits&lt;_ValueType&gt;::is_POD_type _Is_POD;
      return __uninitialized_copy_aux(__first, __last, __result, _Is_POD());
    }
</code></pre>
<p>Es gibt da noch spezialisierungen für char pointer.</p>
<p>Und im dtor steht auch was ich schon sagte.</p>
<pre><code class="language-cpp">/**
       *  The dtor only erases the elements, and note that if the elements
       *  themselves are pointers, the pointed-to memory is not touched in any
       *  way.  Managing the pointer is the user's responsibilty.
       */
      ~vector() { _Destroy(_M_start, _M_finish); }
</code></pre>
<p>@std.proposal</p>
<p>seit wann dürfen denn ctors virtual sein ? oder meinst du das anders ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/847006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/847006</guid><dc:creator><![CDATA[prolog]]></dc:creator><pubDate>Sat, 06 Aug 2005 14:21:16 GMT</pubDate></item></channel></rss>