<?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 Ctor und operator= bei abstrakter Basisklasse]]></title><description><![CDATA[<p>Hallo!</p>
<p>Möchte eine abstrakte Basisklasse haben, die aber nicht leer ist (wie ein Java Interface), sondern durchaus schon eine gewisse Logik mitbringt. Die abgeleiteten Klassen sollen dann nur 2 entsprechende Methoden überschreiben und implementieren.</p>
<p>Nun ist es so, dass ich den Copy Ctor normalerweise für den operator= verwende. Spart Zeit und vor allem ist alles leichter wartbar weil alles zentral an einer Stelle geschieht.<br />
Bei der abstrakten Klasse kann ich aber nichts als Objekt sondern nur als Referenz übergeben. Folglich muss ich im operator= den ganzen Code nochmal runterschreiben.</p>
<pre><code class="language-cpp">//COPY CTOR
    ImageAbstract::ImageAbstract(ImageAbstract&amp; original)
    :m_dataMatrix(0),m_width(original.m_width),m_height(original.m_height),
     m_channels(original.m_channels)
    {
        std::cout&lt;&lt;&quot;base copy ctor\n&quot;;

        createDataMatrix();

        for(coordinates_t x=0;x&lt;m_width;x++)
        {
            for(coordinates_t y=0;y&lt;m_height;y++)
            {
                m_dataMatrix[x][y]=original.m_dataMatrix[x][y];
            }
        }
    }

    //OPERATOR= : wieder das gleiche wie oben...
    ImageAbstract&amp; ImageAbstract::operator=(ImageAbstract&amp; rhs)
    {
        std::cout&lt;&lt;&quot;base =\n&quot;;

        clearDataMatrix();
        m_width=rhs.m_width;
        m_height=rhs.m_height;
        m_channels=rhs.m_channels;

        createDataMatrix();
        for(coordinates_t x=0;x&lt;m_width;x++)
        {
            for(coordinates_t y=0;y&lt;m_height;y++)
            {
                m_dataMatrix[x][y]=rhs.m_dataMatrix[x][y];
            }
        }

        return *this;
    }
</code></pre>
<p>Das einzige was mir einfällt ist eine Hilfsfunktion zu definieren die in beiden Fällen aufgerufen wird und somit der Code nur noch an einer Stelle zu finden ist.</p>
<p>Sonst irgendwelche Möglichkeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303873/copy-ctor-und-operator-bei-abstrakter-basisklasse</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 04:48:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303873.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 May 2012 12:35:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Copy Ctor und operator= bei abstrakter Basisklasse on Thu, 24 May 2012 12:35:30 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Möchte eine abstrakte Basisklasse haben, die aber nicht leer ist (wie ein Java Interface), sondern durchaus schon eine gewisse Logik mitbringt. Die abgeleiteten Klassen sollen dann nur 2 entsprechende Methoden überschreiben und implementieren.</p>
<p>Nun ist es so, dass ich den Copy Ctor normalerweise für den operator= verwende. Spart Zeit und vor allem ist alles leichter wartbar weil alles zentral an einer Stelle geschieht.<br />
Bei der abstrakten Klasse kann ich aber nichts als Objekt sondern nur als Referenz übergeben. Folglich muss ich im operator= den ganzen Code nochmal runterschreiben.</p>
<pre><code class="language-cpp">//COPY CTOR
    ImageAbstract::ImageAbstract(ImageAbstract&amp; original)
    :m_dataMatrix(0),m_width(original.m_width),m_height(original.m_height),
     m_channels(original.m_channels)
    {
        std::cout&lt;&lt;&quot;base copy ctor\n&quot;;

        createDataMatrix();

        for(coordinates_t x=0;x&lt;m_width;x++)
        {
            for(coordinates_t y=0;y&lt;m_height;y++)
            {
                m_dataMatrix[x][y]=original.m_dataMatrix[x][y];
            }
        }
    }

    //OPERATOR= : wieder das gleiche wie oben...
    ImageAbstract&amp; ImageAbstract::operator=(ImageAbstract&amp; rhs)
    {
        std::cout&lt;&lt;&quot;base =\n&quot;;

        clearDataMatrix();
        m_width=rhs.m_width;
        m_height=rhs.m_height;
        m_channels=rhs.m_channels;

        createDataMatrix();
        for(coordinates_t x=0;x&lt;m_width;x++)
        {
            for(coordinates_t y=0;y&lt;m_height;y++)
            {
                m_dataMatrix[x][y]=rhs.m_dataMatrix[x][y];
            }
        }

        return *this;
    }
</code></pre>
<p>Das einzige was mir einfällt ist eine Hilfsfunktion zu definieren die in beiden Fällen aufgerufen wird und somit der Code nur noch an einer Stelle zu finden ist.</p>
<p>Sonst irgendwelche Möglichkeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214891</guid><dc:creator><![CDATA[lalalala]]></dc:creator><pubDate>Thu, 24 May 2012 12:35:30 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Ctor und operator= bei abstrakter Basisklasse on Thu, 24 May 2012 12:41:25 GMT]]></title><description><![CDATA[<p>Rufst du im operator = eine virtual Funktion auf?<br />
(PS: Man nimmt per const-reference, das da ist z.B. gar kein Kopierkonstruktor.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214892</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 24 May 2012 12:41:25 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Ctor und operator= bei abstrakter Basisklasse on Thu, 24 May 2012 12:56:48 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>1. hab den copy ctor auf <strong>const ImageAbstract&amp; original</strong> geändert<br />
2. Wenn ich bei operator= statt Referenz ein Objekt übergebe kommt folgende Meldung: <strong>error: cannot declare parameter ‘rhs’ to be of abstract type ‘lalala::ImageAbstract’</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214896</guid><dc:creator><![CDATA[lalalala]]></dc:creator><pubDate>Thu, 24 May 2012 12:56:48 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Ctor und operator= bei abstrakter Basisklasse on Thu, 24 May 2012 12:59:00 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>(PS: Man nimmt per const-reference, das da ist z.B. gar kein Kopierkonstruktor.)</p>
</blockquote>
<p>oO Natürlich ist das einKopie-Konstruktor. Ein Kopie-Konstruktor ist ein Konstruktor, der eine Referenz erwartet, alles andere ist nur eine zusätzliche Option.</p>
<p>Das sind alle Kopie-Konstruktoren</p>
<pre><code class="language-cpp">X(const          X&amp; copy_from_me);
X(               X&amp; copy_from_me);
X(      volatile X&amp; copy_from_me);
X(const volatile X&amp; copy_from_me);
X(               X&amp; copy_from_me, int = 0);
X(const          X&amp; copy_from_me, double = 1.0, int = 42);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2214898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214898</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Thu, 24 May 2012 12:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Ctor und operator= bei abstrakter Basisklasse on Thu, 24 May 2012 14:44:40 GMT]]></title><description><![CDATA[<p>Hm.. stimmt, 12.8 habe ich mir wohl nie ordentlich durchgelesen. Na ja, ändert ja erstmal nichts daran, dass es hier besser const sein sollte. Ne schöne Lösung fällt mir aber gerade auch nicht ein. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2214960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214960</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 24 May 2012 14:44:40 GMT</pubDate></item><item><title><![CDATA[Reply to Copy Ctor und operator= bei abstrakter Basisklasse on Fri, 25 May 2012 08:28:48 GMT]]></title><description><![CDATA[<p>Soweit ich sehe ist das einzige, was dich zwingt, den copy-Ctor und den op= zu scrheiben, die DataMatrix. der Rest wird simpel kopiert.<br />
Ich vermute aus dem Code einfach mal, dass die dataMatrix einfach nur ein zweidimensionaler vector oder etwas ähnliches ist. Mach eine Klasse draus, die das Kopieren etc. selbst ordentlich beherrscht, dann brauchst du dich in der ImageAbstract-Klasse nicht damit rumzuschlagen. Das wäre so oder so besseres Design, weil die Elementweise Kopie der Matrix mit ziemlicher Sicherheit besser gelöst werden kann. Ohne zu wissen, was die dataMatrix genau ist, kann ich allerdings nicht mehr sagen. Wenn es ein vector ist, kann der sich problemlos auch selbst kopieren, allerdings weiß ich nicht, was die clear- und create-Funktionen sollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2215248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2215248</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 25 May 2012 08:28:48 GMT</pubDate></item></channel></rss>