<?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 Kopierkonstruktor]]></title><description><![CDATA[<p>So hier ist mal n Code aus meinem C++ Buch, in dem ich was nicht verstehe. In Zeile 56 und 83 steht in der Initialisierungsliste des Kopierkonstruktors &quot;Mammal(rhs)&quot;, so aber warum? Was ist der Sinn von dem Code? Und ich verstehe auch nicht wie man dem Mammal Objekt eine Cat bzw. Dog Referenz übergeben kann? Da müsste doch eigentlich n Error kommen? Und was genau der Sinn davon sein soll verstehe ich auch nicht. Dem Mammal Objekt hier kann man doch nur zwei int übergeben? --&gt; (Mammal(int Age,int Weight);) Verstehet einer von euch was das soll? Eigentlich sollte der Hauptaspekt des Codes die Clone Methode sein, und einem zeigendas es nicht möglich ist Kopierkonstruktoren virtuell zu deklarieren, und man somit als alternative eine Clone Methode nimmt. Hier mal der Code (gabs auch schon mal in nem anderen Thread zu ner anderen Frage):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
    Mammal(int Age,int Weight);
    Mammal(const Mammal &amp;rhs);
    virtual ~Mammal();
    int GetAge() const {return *itsAge;}
    int GetWeight() const {return *itsWeight;}
    virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;}
    virtual Mammal* Clone() const {return new Mammal(*this);}
    void SetAge(int a) {*itsAge=a;}
    void SetWeight(int a) {*itsWeight=a;}
    private:
    int *itsAge;
    int *itsWeight;
};

Mammal::Mammal(int Age,int Weight)
:itsAge(new int(Age)),itsWeight(new int(Weight))
{

}

Mammal::Mammal(const Mammal &amp;rhs)
:itsAge(new int(rhs.GetAge())),itsWeight(new int(rhs.GetWeight()))
{
    cout &lt;&lt; &quot;Mammal Kopierkonstruktor\n&quot;;
}

Mammal::~Mammal()
{
    delete itsAge;
    delete itsWeight;
}

class Cat : public Mammal
{
    public:
    Cat(int Age,int Weight);
    Cat(const Cat &amp;rhs);
    virtual ~Cat();
    void Speak() const {cout &lt;&lt; &quot;Miau miau\n&quot;;}
    virtual Cat* Clone() const {return new Cat(*this);}
};

Cat::Cat(int Age,int Weight)
:Mammal(Age,Weight)
{

}

Cat::Cat(const Cat &amp;rhs)
:Mammal(rhs) //&lt;-- und das hier?
{
    cout &lt;&lt; &quot;Cat Kopierkonstruktor\n&quot;;
}

Cat::~Cat()
{

}

class Dog : public Mammal
{
    public:
    Dog(int Age,int Weight);
    Dog(const Dog &amp;rhs);
    virtual ~Dog();
    void Speak() const {cout &lt;&lt; &quot;Wuff wuff\n&quot;;}
    virtual Dog* Clone() const {return new Dog(*this);}
};

Dog::Dog(int Age,int Weight)
:Mammal(Age,Weight)
{

}

Dog::Dog(const Dog &amp;rhs)
:Mammal(rhs) //&lt;-- und das hier?
{
    cout &lt;&lt; &quot;Dog Kopierkonstruktor\n&quot;;
}

Dog::~Dog()
{

}

const int ANIMALS=3;

int main()
{
    int choice;
    Mammal *Tier[ANIMALS];
    Mammal *OtherTier[ANIMALS];
    Mammal *ptr;
    for (int i=0;i&lt;ANIMALS;i++)
    {
        cout &lt;&lt; &quot;Dog(1) Cat(2) Mammal(3)\n&quot;;
        cin &gt;&gt; choice;
        switch(choice)
        {
            case 1:
            ptr=new Dog(3,4);
            break;
            case 2:
            ptr=new Cat(7,4);
            break;
            case 3:
            ptr=new Mammal(1,4);
            break;
        }
        Tier[i]=ptr;
    }
    for (int i=0;i&lt;ANIMALS;i++)
    {
        Tier[i]-&gt;Speak();
        OtherTier[i]=Tier[i]-&gt;Clone();
    }
    for (int i=0;i&lt;ANIMALS;i++)
    {
        cout &lt;&lt; OtherTier[i]-&gt;GetAge() &lt;&lt; &quot;\n&quot;;
    }

    return 0;
}
</code></pre>
<p>Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/174328/frage-zu-kopierkonstruktor</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 17:17:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/174328.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 25 Feb 2007 16:49:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Kopierkonstruktor on Sun, 25 Feb 2007 16:49:55 GMT]]></title><description><![CDATA[<p>So hier ist mal n Code aus meinem C++ Buch, in dem ich was nicht verstehe. In Zeile 56 und 83 steht in der Initialisierungsliste des Kopierkonstruktors &quot;Mammal(rhs)&quot;, so aber warum? Was ist der Sinn von dem Code? Und ich verstehe auch nicht wie man dem Mammal Objekt eine Cat bzw. Dog Referenz übergeben kann? Da müsste doch eigentlich n Error kommen? Und was genau der Sinn davon sein soll verstehe ich auch nicht. Dem Mammal Objekt hier kann man doch nur zwei int übergeben? --&gt; (Mammal(int Age,int Weight);) Verstehet einer von euch was das soll? Eigentlich sollte der Hauptaspekt des Codes die Clone Methode sein, und einem zeigendas es nicht möglich ist Kopierkonstruktoren virtuell zu deklarieren, und man somit als alternative eine Clone Methode nimmt. Hier mal der Code (gabs auch schon mal in nem anderen Thread zu ner anderen Frage):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
    Mammal(int Age,int Weight);
    Mammal(const Mammal &amp;rhs);
    virtual ~Mammal();
    int GetAge() const {return *itsAge;}
    int GetWeight() const {return *itsWeight;}
    virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;}
    virtual Mammal* Clone() const {return new Mammal(*this);}
    void SetAge(int a) {*itsAge=a;}
    void SetWeight(int a) {*itsWeight=a;}
    private:
    int *itsAge;
    int *itsWeight;
};

Mammal::Mammal(int Age,int Weight)
:itsAge(new int(Age)),itsWeight(new int(Weight))
{

}

Mammal::Mammal(const Mammal &amp;rhs)
:itsAge(new int(rhs.GetAge())),itsWeight(new int(rhs.GetWeight()))
{
    cout &lt;&lt; &quot;Mammal Kopierkonstruktor\n&quot;;
}

Mammal::~Mammal()
{
    delete itsAge;
    delete itsWeight;
}

class Cat : public Mammal
{
    public:
    Cat(int Age,int Weight);
    Cat(const Cat &amp;rhs);
    virtual ~Cat();
    void Speak() const {cout &lt;&lt; &quot;Miau miau\n&quot;;}
    virtual Cat* Clone() const {return new Cat(*this);}
};

Cat::Cat(int Age,int Weight)
:Mammal(Age,Weight)
{

}

Cat::Cat(const Cat &amp;rhs)
:Mammal(rhs) //&lt;-- und das hier?
{
    cout &lt;&lt; &quot;Cat Kopierkonstruktor\n&quot;;
}

Cat::~Cat()
{

}

class Dog : public Mammal
{
    public:
    Dog(int Age,int Weight);
    Dog(const Dog &amp;rhs);
    virtual ~Dog();
    void Speak() const {cout &lt;&lt; &quot;Wuff wuff\n&quot;;}
    virtual Dog* Clone() const {return new Dog(*this);}
};

Dog::Dog(int Age,int Weight)
:Mammal(Age,Weight)
{

}

Dog::Dog(const Dog &amp;rhs)
:Mammal(rhs) //&lt;-- und das hier?
{
    cout &lt;&lt; &quot;Dog Kopierkonstruktor\n&quot;;
}

Dog::~Dog()
{

}

const int ANIMALS=3;

int main()
{
    int choice;
    Mammal *Tier[ANIMALS];
    Mammal *OtherTier[ANIMALS];
    Mammal *ptr;
    for (int i=0;i&lt;ANIMALS;i++)
    {
        cout &lt;&lt; &quot;Dog(1) Cat(2) Mammal(3)\n&quot;;
        cin &gt;&gt; choice;
        switch(choice)
        {
            case 1:
            ptr=new Dog(3,4);
            break;
            case 2:
            ptr=new Cat(7,4);
            break;
            case 3:
            ptr=new Mammal(1,4);
            break;
        }
        Tier[i]=ptr;
    }
    for (int i=0;i&lt;ANIMALS;i++)
    {
        Tier[i]-&gt;Speak();
        OtherTier[i]=Tier[i]-&gt;Clone();
    }
    for (int i=0;i&lt;ANIMALS;i++)
    {
        cout &lt;&lt; OtherTier[i]-&gt;GetAge() &lt;&lt; &quot;\n&quot;;
    }

    return 0;
}
</code></pre>
<p>Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1235293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1235293</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sun, 25 Feb 2007 16:49:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Kopierkonstruktor on Sun, 25 Feb 2007 18:57:06 GMT]]></title><description><![CDATA[<p>ich seh hier drei sachen, die dir eventuell unklar sind:</p>
<p>einmal vererbung (mit konstruktoraufruf der basisklasse über intitialisierungsliste)<br />
dann polymorphie (mit einem zeiger der basisklasse auf ein abgeleitetes kindobjekt zeigen)<br />
und drittens das sehr große thema kopierkonstruktor, der übrigens dann aufgerufen wird, wenn du eine kopie erstellst:</p>
<pre><code>Cat miau;
Cat zuzu(miau); //Cat zuzu = miau;
</code></pre>
<p>reiß die themen auseinander und lese zu jedem einzelnen die kapitel. <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/1235382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1235382</guid><dc:creator><![CDATA[elise]]></dc:creator><pubDate>Sun, 25 Feb 2007 18:57:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Kopierkonstruktor on Sun, 25 Feb 2007 20:24:55 GMT]]></title><description><![CDATA[<p>Also einen Error gibts berechtigterweise nicht, weil der Code i.O. Cat und Dog sind von Mammal abgeleitet. Und einer der Mammal-Ctors hat Mammal-Ref-Parameter. Cat und Dog sind Mammal. Also richtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1235463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1235463</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sun, 25 Feb 2007 20:24:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Kopierkonstruktor on Sun, 25 Feb 2007 22:38:28 GMT]]></title><description><![CDATA[<p>Mh ich verstehe das trotzdem nicht ,da ist mein Buch anscheinend unzureichend, und was ein Kopierkonstruktor ist und macht, genauso was Vererbung ist weiß ich eigentlich schon. Und polymorphie bin ich noch am üben, na ja vll. hat jemand ja noch n Link für mich?<br />
Hier wäre noch eine Frage zu nem Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
    Mammal(int Age):itsAge(Age) {};
    ~Mammal() {};
    virtual void Speak() const {cout &lt;&lt; &quot;Mammal spricht\n&quot;;}
    virtual Mammal * Clone() const {return new Mammal(*this);}
    int GetAge() const {return itsAge;}
    private:
    int itsAge;
};

class Cat : public Mammal
{
    public:
    Cat(int Age,int Weight):Mammal(Age),itsWeight(Weight) {};
    ~Cat() {};
    void Speak() const {cout &lt;&lt; &quot;Katze spricht\n&quot;;}
    Cat * Clone() const {return new Cat(*this);}
    private:
    int itsWeight;
};

int main()
{
    Cat Hans(4,5);
    Mammal Issa(Hans); 
    Issa.Speak(); //warum kommt hier als Ausgabe &quot;Mammal spricht&quot; und nicht &quot;Katze spricht&quot;
    return 0;
}
</code></pre>
<p>Was passiert genau bei &quot;Mammal Issa(Hans)&quot; Normalerwiese müsste es doch z.B. so heißen &quot;Mammal Issa(23)&quot; wie kann ich dann aber anstatt z.B. der Zahl 23 einfach nur das Cat Objekt Hans verwenden? Übernimmt Issa von Hans nur irgendwie die Parameter, weil wenn ich &quot;Issa.GetAge()&quot; mache dann gibt der 4 zurück. Also irgendwie steh ich auf der Leitung, vll. brauch ich nur n kleinen Stoß und ich blicks. Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1235531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1235531</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sun, 25 Feb 2007 22:38:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Kopierkonstruktor on Mon, 26 Feb 2007 07:07:02 GMT]]></title><description><![CDATA[<p>Polymorphie kannst du nur beobachten, wenn du mit Zeigern oder Referenzen arbeitest. Du hast dort aber konkrete Objekte vorliegen. Und der Ausdruck <code>Mammal Issa(Hans);</code> erzeugt ein neues Objekt mit dem Mammal-CopyCtor (dabei geht der Cat-Anteil von Hans verloren).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1235561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1235561</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 26 Feb 2007 07:07:02 GMT</pubDate></item></channel></rss>