<?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[abstrakte Basisklasse und Vererbung]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich soll eine von der abstrakten Basisklasse Function abgeleitete Klasse Polynomial schreiben und bräuchte dabei dringend Hilfe.<br />
Die Anforderungen an Konstruktoren und Memberfunctions sind in der Polynomial.hpp nochmal beschrieben.</p>
<p>Ich hoffe ihr könnt mir helfen und dankeschön schonmal! <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>
<pre><code>//  Function.hpp

#pragma once
#include &lt;cstdlib&gt;

class Function {
public:

    virtual double operator() (double x) const = 0;
    virtual ~Function() {};
};

//  Polynomial.hpp

#pragma once
#include &lt;cstdlib&gt;
#include &quot;Function.hpp&quot;

///@@ NOTE: Polynomial must be derived from Function!
class Polynomial : public Function {
public:
    //! Default constructor
    //! Creates 0th-order polynomial p(x) = 0
    Polynomial();
    //
    //! Constructor: Construct polynomial with given coefficients
    //! The coefficients are copied and stored by the class, the
    //! pointer pc to the original array is *not* used again.
    //! \param pc pointer to coefficient array
    //! \param number of coefficients (=order of polynomial)
    Polynomial(const double* const pc, size_t n);

	~Polynomial();

    //
    //! Set polynomial coefficients. Coefficients are copied, the
    //! pointer pc is never used again.
    //! \param pc pointer to coefficient array
    //! \param number of coefficients (=order of polynomial)
    void setCoefficients(const double* const pc, size_t n);
</code></pre>
<p>Wozu brauche ich denn setCoefficient?? Macht die nicht dasselbe wie der Konstructor??</p>
<pre><code>virtual double operator() (double x) const;

private:
    ///@@ you *must* use a plain-C double array to store
    ///@@ the coefficients of the polynomial, std::vector is NOT allowed
    double * pc_;
    size_t n_;
};

//  Polynomial.cpp

#include &quot;Polynomial.hpp&quot;
#include &lt;iostream&gt;
#include &lt;math.h&gt;

using namespace std;

Polynomial::Polynomial(const double* const pc, size_t n) : n_(n) {
	pc_ = new double[n];
	for (size_t i = 0; i &lt; n; ++i) {
		pc_[i] = pc[n-i-1];
		cout &lt;&lt; pc_[i] &lt;&lt; endl;
	}
	setCoefficients(pc_, n_);
}

Polynomial::~Polynomial() {
	delete[] pc_;
}
void Polynomial::setCoefficients(const double* const pc, size_t n) {
	cout &lt;&lt; &quot;p(x) = &quot;;
		for (size_t i = 0; i &lt; n; ++i) {
			cout &lt;&lt; pc[i] &lt;&lt; &quot; * x^&quot; &lt;&lt; i &lt;&lt; &quot; + &quot;;
		}
		cout &lt;&lt; endl;
}

double Polynomial::operator() (double x) const {
	double y = 0;
	for (size_t i = 0; i &lt; n_; ++i) {
		y += pc_[i] * std::pow(x,i);
	}
	return y;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/325137/abstrakte-basisklasse-und-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 18:47:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325137.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Apr 2014 10:03:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Wed, 16 Apr 2014 10:03:46 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich soll eine von der abstrakten Basisklasse Function abgeleitete Klasse Polynomial schreiben und bräuchte dabei dringend Hilfe.<br />
Die Anforderungen an Konstruktoren und Memberfunctions sind in der Polynomial.hpp nochmal beschrieben.</p>
<p>Ich hoffe ihr könnt mir helfen und dankeschön schonmal! <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>
<pre><code>//  Function.hpp

#pragma once
#include &lt;cstdlib&gt;

class Function {
public:

    virtual double operator() (double x) const = 0;
    virtual ~Function() {};
};

//  Polynomial.hpp

#pragma once
#include &lt;cstdlib&gt;
#include &quot;Function.hpp&quot;

///@@ NOTE: Polynomial must be derived from Function!
class Polynomial : public Function {
public:
    //! Default constructor
    //! Creates 0th-order polynomial p(x) = 0
    Polynomial();
    //
    //! Constructor: Construct polynomial with given coefficients
    //! The coefficients are copied and stored by the class, the
    //! pointer pc to the original array is *not* used again.
    //! \param pc pointer to coefficient array
    //! \param number of coefficients (=order of polynomial)
    Polynomial(const double* const pc, size_t n);

	~Polynomial();

    //
    //! Set polynomial coefficients. Coefficients are copied, the
    //! pointer pc is never used again.
    //! \param pc pointer to coefficient array
    //! \param number of coefficients (=order of polynomial)
    void setCoefficients(const double* const pc, size_t n);
</code></pre>
<p>Wozu brauche ich denn setCoefficient?? Macht die nicht dasselbe wie der Konstructor??</p>
<pre><code>virtual double operator() (double x) const;

private:
    ///@@ you *must* use a plain-C double array to store
    ///@@ the coefficients of the polynomial, std::vector is NOT allowed
    double * pc_;
    size_t n_;
};

//  Polynomial.cpp

#include &quot;Polynomial.hpp&quot;
#include &lt;iostream&gt;
#include &lt;math.h&gt;

using namespace std;

Polynomial::Polynomial(const double* const pc, size_t n) : n_(n) {
	pc_ = new double[n];
	for (size_t i = 0; i &lt; n; ++i) {
		pc_[i] = pc[n-i-1];
		cout &lt;&lt; pc_[i] &lt;&lt; endl;
	}
	setCoefficients(pc_, n_);
}

Polynomial::~Polynomial() {
	delete[] pc_;
}
void Polynomial::setCoefficients(const double* const pc, size_t n) {
	cout &lt;&lt; &quot;p(x) = &quot;;
		for (size_t i = 0; i &lt; n; ++i) {
			cout &lt;&lt; pc[i] &lt;&lt; &quot; * x^&quot; &lt;&lt; i &lt;&lt; &quot; + &quot;;
		}
		cout &lt;&lt; endl;
}

double Polynomial::operator() (double x) const {
	double y = 0;
	for (size_t i = 0; i &lt; n_; ++i) {
		y += pc_[i] * std::pow(x,i);
	}
	return y;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2394855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394855</guid><dc:creator><![CDATA[bina]]></dc:creator><pubDate>Wed, 16 Apr 2014 10:03:46 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Wed, 16 Apr 2014 10:18:34 GMT]]></title><description><![CDATA[<p>hallo</p>
<p>kommt mit bekannt vor: <a href="http://www.c-plusplus.net/forum/324188-full" rel="nofollow">http://www.c-plusplus.net/forum/324188-full</a></p>
<p>snip, nicht richtig gelesen.</p>
<p>darf ich fragen von wo der code ist? ist das irgendeine aufgabe oder sowas?</p>
<p>ja, setCoefficients sollte das selbe machen wie der konstruktor. quasi eine assign-methode. setCoefficients kann einfach den konstruktor aufrufen, ganz ohne code-redundanz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394857</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Wed, 16 Apr 2014 10:18:34 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Mon, 21 Apr 2014 20:42:47 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort!<br />
Das ist eine Übungsaufgabe, genau.</p>
<p>Ich versteh die edits nicht ganz. Wofür wäre denn diese swap methode und wie kann man einen std::vector nachimplementieren??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395740</guid><dc:creator><![CDATA[bina]]></dc:creator><pubDate>Mon, 21 Apr 2014 20:42:47 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Tue, 22 Apr 2014 12:08:40 GMT]]></title><description><![CDATA[<p>bina schrieb:</p>
<blockquote>
<p>Wofür wäre denn diese swap methode und wie kann man einen std::vector nachimplementieren??</p>
</blockquote>
<p>Das mit dem Vektor vergiss einfach wieder.</p>
<p>Die <code>swap</code> Funktion vereinfacht die Implementierung einiger Funktionen, die noch fehlen. Könnte so aussehen:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;

void Polynomial::swap(Polynomial&amp; x){
  using std::swap;
  swap(x.pc_, pc_);
  swap(x.n_, n_);
}
</code></pre>
<p>Und ja <code>setCoefficient()</code> macht ungefähr das gleiche wie der Konstruktor. Das machen wir uns zu nutze.<br />
Und dann nehmen wir auch noch swap dazu et voilá:</p>
<pre><code class="language-cpp">void Polynomial::setCoefficients(const double* const pc, size_t n){
  // bau ein Polynomial und tausch Plaetze mit diesem:
  Polynomial(pc, n).swap(*this);
}
</code></pre>
<p>Das war ja einfach! Und alle Widrigkeiten (n!=this-&gt;n_) elegant umschifft. <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>Trotzdem hat Polynomial so wie es jetzt da steht noch ein Riesenproblem:</p>
<pre><code class="language-cpp">void f(){
  Polynomial p1;
  Polynomial p2(p1);
} // crash!
</code></pre>
<p>Warum macht das Programm hier einen uneleganten Abgang?<br />
Lies mal, über die &quot;Rule of three&quot; in C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2395818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2395818</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Tue, 22 Apr 2014 12:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Sun, 27 Apr 2014 18:15:48 GMT]]></title><description><![CDATA[<p>Das heißt mir fehlen noch copy constructor und copy assignment.</p>
<p>Könnte das nach der deklaration im header dann so aussehen?</p>
<pre><code>Polynomial::Polynomial(const Polynomial&amp; polyn) : pc_(polyn.pc_), n_(polyn.n_)
{
}

Polynomial&amp; Polynomial::operator=(const Polynomial&amp; polyn) {
	pc_ = polyn.pc_;
	n_ = polyn.n_;
	return *this;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2396564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396564</guid><dc:creator><![CDATA[bina]]></dc:creator><pubDate>Sun, 27 Apr 2014 18:15:48 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Sun, 27 Apr 2014 20:15:39 GMT]]></title><description><![CDATA[<p>bina schrieb:</p>
<blockquote>
<p>Das heißt mir fehlen noch copy constructor und copy assignment.</p>
</blockquote>
<p>Ja. stimmt!</p>
<p>bina schrieb:</p>
<blockquote>
<p>Könnte das nach der deklaration im header dann so aussehen?</p>
<pre><code>Polynomial::Polynomial(const Polynomial&amp; polyn) : pc_(polyn.pc_), n_(polyn.n_)
{
}

Polynomial&amp; Polynomial::operator=(const Polynomial&amp; polyn) {
	pc_ = polyn.pc_;
	n_ = polyn.n_;
	return *this;
}
</code></pre>
</blockquote>
<p>Nein - jetzt hast Du genau die implizit definierten Versionen nachgebaut, die auch der Compiler generiert.<br />
Hast Du denn verstanden, warum die Rule of three wichtig ist, und warum f() oben crasht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396579</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Sun, 27 Apr 2014 20:15:39 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Mon, 28 Apr 2014 07:21:30 GMT]]></title><description><![CDATA[<p>f() crasht, weil der destructor zweimal aufgerufen wird, die selbe adresse zu löschen, oder?</p>
<p>das heißt, ich muss ein neues array erzeugen...</p>
<pre><code>Polynomial::Polynomial(const Polynomial&amp; polyn) {
	n_ = polyn.n_;
	pc_ = new double[polyn.n_];
	for (size_t i = 0; i &lt; polyn.n_; ++i) {
		pc_[i] = polyn.pc_[i];
	}
}

Polynomial&amp; Polynomial::operator=(const Polynomial&amp; polyn) {
	if (&amp;polyn != this) {
		n_ = polyn.n_;
		pc_ = new double[polyn.n_];
		for (size_t i = 0; i &lt; polyn.n_; ++i) {
			pc_[i] = polyn.pc_[i];
		}
	}
	return *this;
}
</code></pre>
<p>so in etwa?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396612</guid><dc:creator><![CDATA[bina]]></dc:creator><pubDate>Mon, 28 Apr 2014 07:21:30 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Mon, 28 Apr 2014 07:39:17 GMT]]></title><description><![CDATA[<p>prinzipiell schon richtig.<br />
Im Assignment Operator musst du das Array vor dem Neuerzeugen erstmal löschen.<br />
Im Copyconstructor kannst du ruhig auch die Initialisierungsliste nutzen.<br />
Noch schöner ist es den Assignmentoperator über den Copyconstructor zu definieren.<br />
Schau mal nach Copy-Swap-Ideom.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396613</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 28 Apr 2014 07:39:17 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Mon, 28 Apr 2014 08:45:18 GMT]]></title><description><![CDATA[<p>bina schrieb:</p>
<blockquote>
<p>f() crasht, weil der destructor zweimal aufgerufen wird, die selbe adresse zu löschen, oder?</p>
<p>das heißt, ich muss ein neues array erzeugen...</p>
</blockquote>
<p>Genau. Offensichtlich war das dann ein Flüchtigkeitsfehler mit Deinem ersten Schuß von Copy C'tor und -Assignment.</p>
<p>Versuch die einzelnen Konstruktoren und Operatoren aufeinander aufzubauen. Du kannst u.U. auch C++11 features nutzen, z.B. Konstruktoren bequem aus Konstruktoren aufrufen (<em>Delegating Constructors</em>):</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt; // copy

Polynomial::Polynomial(const double* const pc, size_t n)
  : pc_(new double[n]), n_(n)
{
  std::copy(pc, pc+n, pc_);
}

// diser C'tor delegiert an den C'tor oben - der macht dann die Arbeit
Polynomial::Polynomial(const Polynomial&amp; poly)
  : Polynomial(poly.pc_, poly.n_)
{
}
</code></pre>
<p>Vergiss auch nicht, dass Du unter anderem auch schon ein <code>swap()</code> im Baukasten hast. Und das von Braunstein erwähnte Copy/Swap Idiom benutzt Du u.U. schon, wenn Du <code>setCoefficients()</code> so übernommen hast, wie sie oben steht.<br />
Du wirst sehen, dass die Zeilenanzahl angenehm übersichtlich bleibt und Du nirgendwo über Sonderfälle stolperst oder manuell Speicher freigeben musst (Ausser natürlich im Destruktor.)</p>
<p>Ich klebe es hier nochmal rein:</p>
<pre><code class="language-cpp">void Polynomial::setCoefficients(const double* const pc, size_t n){
  // bau ein Polynomial und tausch Plaetze mit diesem:
  Polynomial(pc, n).swap(*this);
}
</code></pre>
<p>Händisch würde man das evtl. so programmieren müssen:</p>
<ul>
<li>alten Speicher freigeben</li>
<li>neuen Speicher allozieren</li>
<li>n_ kopieren</li>
<li>Daten kopieren</li>
</ul>
<p>Das alles in nur einer Zeile.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396616</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Mon, 28 Apr 2014 08:45:18 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Mon, 28 Apr 2014 10:18:45 GMT]]></title><description><![CDATA[<p>Furble Wurble schrieb:</p>
<blockquote>
<p>Händisch würde man das evtl. so programmieren müssen:</p>
<ul>
<li>alten Speicher freigeben</li>
<li>neuen Speicher allozieren</li>
<li>n_ kopieren</li>
<li>Daten kopieren</li>
</ul>
<p>Das alles in nur einer Zeile.</p>
</blockquote>
<p>Eher<br />
* Neuen Speicher anfordern<br />
* Neuen Speicher initialisieren<br />
* Zeiger- und Grösse-Member auf neuen Speicher verbiegen<br />
* Alten Speicher freigeben</p>
<p>Sonst ist das ganze nämlich nicht Exception-safe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396627</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 28 Apr 2014 10:18:45 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Mon, 28 Apr 2014 13:44:32 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Sonst ist das ganze nämlich nicht Exception-safe.</p>
</blockquote>
<p>An der exceptionsafety aendert das wenig. Es gibt nur keine strong guarantee.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396651</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Mon, 28 Apr 2014 13:44:32 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Mon, 28 Apr 2014 23:36:14 GMT]]></title><description><![CDATA[<p>Marthog schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Sonst ist das ganze nämlich nicht Exception-safe.</p>
</blockquote>
<p>An der exceptionsafety aendert das wenig. Es gibt nur keine strong guarantee.</p>
</blockquote>
<p>Wenn man nur stur die einzelnen Punkte runtertippt, dann ist es gar nicht exception-safe.<br />
Wenn man es &quot;richtig&quot; macht, und auch der Destruktor passend implementiert ist (wovon man in diesem Fall vermutlich ausgehen kann), dann bekommt man die basic guarantee.</p>
<p>Sogesehen hast du Recht.</p>
<p>Allerdings halte ich die basic guarantee für zu schwach um nützlich zu sein. Wobei es lustigerweise keinen (mir bekannten) Namen für das mMn. nützlichere Mittelding zwischen strong und basic gibt. Nämlich die Garantie dass das Objekt in einem gültigen, aber undefinierten Zustand zurückbleibt. D.h. zusätzlich zur basic guarantee (=nur garantiert dass man das Objekt ohne Probleme löschen kann) noch die Garantie dass man sämtliche Memberfunktionen (und friends bzw. was sonst noch zum Interface der Klasse gehört) aufrufen kann ohne dass es UB gibt.</p>
<p>Und ganz allgemein halte ich es für angebracht bei der Beschreibung von solchen Dingen darauf zu achten nichts wichtiges auszulassen -- auch wenn ein erfahrener Programmierer (der dann allerdings gar keinen Teil der Erklärung braucht, weil er es schon weiss) es sich denken kann.<br />
Also:<br />
* alten Speicher freigeben<br />
*** <code>pc_</code> auf NULL setzen**<br />
* neuen Speicher allozieren<br />
* n_ kopieren<br />
* Daten kopieren</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396721</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 28 Apr 2014 23:36:14 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Tue, 29 Apr 2014 08:14:25 GMT]]></title><description><![CDATA[<p>händisch geschrieben müsste der assignment operator also dann so aussehen:</p>
<pre><code>Polynomial&amp; Polynomial::operator=(const Polynomial&amp; polyn) {
	if (&amp;polyn != this) {
		delete[] pc_;
		pc_ = new double[polyn.n_];
		n_ = polyn.n_;
		for (size_t i = 0; i &lt; polyn.n_; ++i) {
			pc_[i] = polyn.pc_[i];
		}
	}
	return *this;
}
</code></pre>
<p>und wenn ich nun das copy/swap ideom benutze, könnte ich das so schreiben?</p>
<pre><code>Polynomial&amp; Polynomial::operator=(const Polynomial&amp; poly) {
	if (&amp;poly != this) {
		Polynomial(poly.pc_, poly.n_).swap(*this);
	}
	return *this;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2396741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396741</guid><dc:creator><![CDATA[bina]]></dc:creator><pubDate>Tue, 29 Apr 2014 08:14:25 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Tue, 29 Apr 2014 08:37:19 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23821">@Marthog</a><br />
Siehst du jetzt was ich meine?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396742</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 29 Apr 2014 08:37:19 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Tue, 29 Apr 2014 08:40:13 GMT]]></title><description><![CDATA[<p>bina schrieb:</p>
<blockquote>
<p>händisch geschrieben müsste der assignment operator also dann so aussehen:</p>
<pre><code>Polynomial&amp; Polynomial::operator=(const Polynomial&amp; polyn) {
	if (&amp;polyn != this) {
		delete[] pc_;
		pc_ = new double[polyn.n_];
		n_ = polyn.n_;
		for (size_t i = 0; i &lt; polyn.n_; ++i) {
			pc_[i] = polyn.pc_[i];
		}
	}
	return *this;
}
</code></pre>
</blockquote>
<p>Ja.<br />
Du kannst noch an der Reihenfolge drehen z.B. erst wenn eine neue Allozierung erfolgreich war, das alte Array freigeben. (Das wurde von Hustbaer und Marthog angerissen. Exkurs: Stichwort: <a href="http://en.wikipedia.org/wiki/Exception_safety" rel="nofollow">Exception safety</a>.)<br />
Du kannst auch darauf verzichten neu zu allozieren, wenn Du gleichviel oder weniger Speicher brauchst. Und, und, und...<br />
Aber prinzipiell: ja.</p>
<p>bina schrieb:</p>
<blockquote>
<p>und wenn ich nun das copy/swap ideom benutze, könnte ich das so schreiben?</p>
<pre><code>Polynomial&amp; Polynomial::operator=(const Polynomial&amp; poly) {
	if (&amp;poly != this) {
		Polynomial(poly.pc_, poly.n_).swap(*this);
	}
	return *this;
}
</code></pre>
</blockquote>
<p>Ja.</p>
<p>Da fällt die Wahl doch leicht. <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/2396743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396743</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Tue, 29 Apr 2014 08:40:13 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Tue, 29 Apr 2014 08:49:27 GMT]]></title><description><![CDATA[<p>Für copy &amp; swap reicht</p>
<pre><code class="language-cpp">Polynomial&amp; Polynomial::operator=(Polynomial other) { 
     swap(other); 
     return *this; 
}
</code></pre>
<p>Und für die basic exception-guarantee reicht</p>
<pre><code class="language-cpp">delete[] pc_;
        pc_ = 0; // &lt;----------------------
        pc_ = new double[polyn.n_];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2396745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396745</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 29 Apr 2014 08:49:27 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Tue, 29 Apr 2014 08:49:56 GMT]]></title><description><![CDATA[<p>bina schrieb:</p>
<blockquote>
<p>und wenn ich nun das copy/swap ideom benutze, könnte ich das so schreiben?</p>
<pre><code>Polynomial&amp; Polynomial::operator=(const Polynomial&amp; poly) {
	if (&amp;poly != this) {
		Polynomial(poly.pc_, poly.n_).swap(*this);
	}
	return *this;
}
</code></pre>
</blockquote>
<p>Der Test auf Selbstzuweisung ist nicht mehr notwendig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396746</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 29 Apr 2014 08:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Tue, 29 Apr 2014 17:48:12 GMT]]></title><description><![CDATA[<p>Vielen vielen Dank euch allen!!!</p>
<p>Eine abschließende Frage hab ich noch. Ich bekomm eine Compilerwarnung und zwar: error C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe...<br />
Ignoriere ich das gekonnt, oder muss ich da was ändern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396789</guid><dc:creator><![CDATA[bina]]></dc:creator><pubDate>Tue, 29 Apr 2014 17:48:12 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Tue, 29 Apr 2014 18:16:10 GMT]]></title><description><![CDATA[<p>bina schrieb:</p>
<blockquote>
<p>Ich bekomm eine Compilerwarnung und zwar: error C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe...<br />
Ignoriere ich das gekonnt, oder muss ich da was ändern?</p>
</blockquote>
<p>Das ignorierst Du natürlich nicht, sondern behebst es.<br />
Wenn der Fehler nicht offensichtlich ist, kommst Du nicht darum herum uns die fragliche Stelle in Deinem Code zu zeigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396790</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Tue, 29 Apr 2014 18:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Tue, 29 Apr 2014 18:34:33 GMT]]></title><description><![CDATA[<p>die fragliche stelle ist in zeile 2132 einer datei namens xutility:</p>
<pre><code>template&lt;class _InIt,
	class _OutIt&gt; inline
	_OutIt copy(_InIt _First, _InIt _Last,
		_OutIt _Dest)
	{	// copy [_First, _Last) to [_Dest, ...)
	if (_First == _Last)
		return (_Dest);
	else
		{	// worth copying, check then copy
		_DEBUG_RANGE(_First, _Last);
		_DEBUG_POINTER(_Dest);
		return (_Copy_impl(_Unchecked(_First), _Unchecked(_Last),
==&gt;			_Dest, _Is_checked(_Dest)));
		}
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2396791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396791</guid><dc:creator><![CDATA[bina]]></dc:creator><pubDate>Tue, 29 Apr 2014 18:34:33 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Tue, 29 Apr 2014 18:41:14 GMT]]></title><description><![CDATA[<p>bina schrieb:</p>
<blockquote>
<p>die fragliche stelle ist in zeile 2132 einer datei namens xutility</p>
</blockquote>
<p>Wichtig ist die Stelle, wo Du <code>std::copy()</code> aufrufst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396792</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Tue, 29 Apr 2014 18:41:14 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Tue, 29 Apr 2014 20:57:20 GMT]]></title><description><![CDATA[<p>Das kommt immer wenn man &quot;unsafe&quot; Iteratoren verwendet. Wie z.B. Zeiger.<br />
=&gt;<br />
#define _SCL_SECURE_NO_WARNINGS</p>
<p><a href="http://msdn.microsoft.com/en-us/library/aa985974.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/aa985974.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396806</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 29 Apr 2014 20:57:20 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Wed, 30 Apr 2014 16:29:01 GMT]]></title><description><![CDATA[<p>Furble Wurble schrieb:</p>
<blockquote>
<p>bina schrieb:</p>
<blockquote>
<p>die fragliche stelle ist in zeile 2132 einer datei namens xutility</p>
</blockquote>
<p>Wichtig ist die Stelle, wo Du <code>std::copy()</code> aufrufst.</p>
</blockquote>
<p>Da hab ich deinen Teil übernommen:</p>
<pre><code>Polynomial::Polynomial(const double* const pc, size_t n)
: pc_(new double[n]), n_(n)
{
	std::copy(pc, pc + n, pc_);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2396891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396891</guid><dc:creator><![CDATA[bina]]></dc:creator><pubDate>Wed, 30 Apr 2014 16:29:01 GMT</pubDate></item><item><title><![CDATA[Reply to abstrakte Basisklasse und Vererbung on Wed, 30 Apr 2014 16:57:59 GMT]]></title><description><![CDATA[<p>bina schrieb:</p>
<blockquote>
<pre><code>Polynomial::Polynomial(const double* const pc, size_t n)
: pc_(new double[n]), n_(n)
{
	std::copy(pc, pc + n, pc_);
}
</code></pre>
</blockquote>
<p>Der Code ist richtig.</p>
<p>Wenn Dich das <em>wie und warum</em> der Warnung interessiert, steht sicherlich viel zur Erklärung in hustbaers Link zum MSDN...<br />
Oder Du übernimmst einfach das Makro, das er gepostet hat und gut ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396899</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Wed, 30 Apr 2014 16:57:59 GMT</pubDate></item></channel></rss>