<?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[C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client.]]></title><description><![CDATA[<p>Hallo,<br />
ich bin blutiger Anfänger bei C++. Ich komme eigentlich aus der Java-Sparte. C habe ich mir in den letzten 2 Monaten auch angeeignet. Jetzt versuche ich mich daran was objektorientiertes mit C++ auf die Beine zu stellen, doch in der main-Methode bekomme ich immer folgende Fehler, die ich mir nicht erklären kann und schon seit Ewigkeiten sitze ich daran fest.</p>
<p>Line 13: error: request for member 'add' in 'cart', which is of non-classtype 'ShoppingCart*'<br />
Line 14: error: request for member 'add' in 'cart', which is of non-classtype 'ShoppingCart*'<br />
Line 15: error: request for member 'add' in 'cart', which is of non-classtype 'ShoppingCart*'<br />
Line 16: error: request for member 'add' in 'cart', which is of non-classtype 'ShoppingCart*'<br />
Line 17: error: request for member 'getTotalCost' in 'cart', which is of non-classtype 'ShoppingCart*'</p>
<p>Zum Programm:<br />
CartItem beschreibt ein Produkt mit Name, Anzahl und Einzelpreis.<br />
ShoppinCart ist der Einkaufswagen, der CartItem-Objekte in einer vector-Liste enthält.<br />
Die main-Methode soll nun einfach ein paar Produkte in den Einkaufswagen legen und den Gesamtpreis ausgeben.</p>
<p>Wie gesagt ich hänge hier schon seit Ewigkeiten fest und ich versteh nicht was ich da falsch mache. Der Vollständigkeit halber einfach mal der gesamte Quelltext, falls ich irgendwas falsch deklariert hab oder nicht richtig initialisiert oder was auch immer. Bei C++ bin ich noch sehr unbeholfen was das angeht.</p>
<p>CartItem.h</p>
<pre><code class="language-cpp">#ifndef CARTITEM_H
#define CARTITEM_H
#include &lt;string&gt;
class CartItem {
    private:
        std::string name;
        int quantity;
        double pricePerUnit;

    public:
        CartItem(const std::string name,const int quant,const double price);
        double getCost();
        std::string getName();
        int getQuantity();
        double getPricePerUnit();
        void setQuantity(const int n);
        void setPricePerUnit(const double price);
        void setName(const std::string name);
};
#endif
</code></pre>
<p>CartItem.cpp</p>
<pre><code class="language-cpp">#include &quot;CartItem.h&quot;

CartItem::CartItem(const std::string name, const int quant, const double price) {
    setName(name);
    setQuantity(quant);
    setPricePerUnit(price);
}

double CartItem::getCost() {
    return quantity*pricePerUnit;
}

std::string CartItem::getName() {
    return name;
}

int CartItem::getQuantity() {
    return quantity;
}

double CartItem::getPricePerUnit() {
    return pricePerUnit;
}

void CartItem::setQuantity(const int n) {
    quantity = n;
}

void CartItem::setPricePerUnit(const double price) {
    pricePerUnit = price;
}

void CartItem::setName(const std::string name) {
    this-&gt;name = name;
}
</code></pre>
<p>ShoppingCart.h</p>
<pre><code class="language-cpp">#ifndef SHOPPINGCART_H
#define SHOPPINGCART_H
#include &lt;vector&gt;
#include &quot;CartItem.h&quot;
class ShoppingCart {
    private:
        std::vector&lt;CartItem&gt; contentList;
    public:
        ShoppingCart();
        void add(const CartItem item);
        double getTotalCost();
        int getNumberOfItems();
        CartItem getItem(const int i);
};
#endif
</code></pre>
<p>ShoppingCart.cpp</p>
<pre><code class="language-cpp">#include &quot;ShoppingCart.h&quot;

/*ShoppingCart::ShoppingCart() {

}*/

void ShoppingCart::add(const CartItem item) {
    contentList.push_back(item);
}

double ShoppingCart::getTotalCost() {
    double totalCost=0;
    for(unsigned int i=0; i&lt;contentList.size(); i++) {
        totalCost += contentList.at(i).getCost();
    }
    return totalCost;
}

int ShoppingCart::getNumberOfItems() {
    return contentList.size();
}

CartItem ShoppingCart::getItem(const int i) {
    return contentList.at(i);
}
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;ShoppingCart.h&quot;
#include &quot;CartItem.h&quot;

using namespace std;

int main() {
    ShoppingCart* cart = new ShoppingCart();
    CartItem* hundefutter = new CartItem(&quot;Hundefutter&quot;, 6, 3.20);
    CartItem* kekse = new CartItem(&quot;Kekse&quot;, 4, 1.59);
    CartItem* milch = new CartItem(&quot;Milch&quot;, 1, 0.69);
    CartItem* marmelade = new CartItem(&quot;Erdbeerkonfituere&quot;, 3, 2.19);
    cart.add(hundefutter);
    cart.add(kekse);
    cart.add(milch);
    cart.add(marmelade);
    cout &lt;&lt; cart.getTotalCost();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/296682/c-unbeholfen-bei-der-objektorientierung-fehler-beim-client</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 19:32:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296682.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Dec 2011 20:30:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Fri, 09 Dec 2011 20:30:11 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich bin blutiger Anfänger bei C++. Ich komme eigentlich aus der Java-Sparte. C habe ich mir in den letzten 2 Monaten auch angeeignet. Jetzt versuche ich mich daran was objektorientiertes mit C++ auf die Beine zu stellen, doch in der main-Methode bekomme ich immer folgende Fehler, die ich mir nicht erklären kann und schon seit Ewigkeiten sitze ich daran fest.</p>
<p>Line 13: error: request for member 'add' in 'cart', which is of non-classtype 'ShoppingCart*'<br />
Line 14: error: request for member 'add' in 'cart', which is of non-classtype 'ShoppingCart*'<br />
Line 15: error: request for member 'add' in 'cart', which is of non-classtype 'ShoppingCart*'<br />
Line 16: error: request for member 'add' in 'cart', which is of non-classtype 'ShoppingCart*'<br />
Line 17: error: request for member 'getTotalCost' in 'cart', which is of non-classtype 'ShoppingCart*'</p>
<p>Zum Programm:<br />
CartItem beschreibt ein Produkt mit Name, Anzahl und Einzelpreis.<br />
ShoppinCart ist der Einkaufswagen, der CartItem-Objekte in einer vector-Liste enthält.<br />
Die main-Methode soll nun einfach ein paar Produkte in den Einkaufswagen legen und den Gesamtpreis ausgeben.</p>
<p>Wie gesagt ich hänge hier schon seit Ewigkeiten fest und ich versteh nicht was ich da falsch mache. Der Vollständigkeit halber einfach mal der gesamte Quelltext, falls ich irgendwas falsch deklariert hab oder nicht richtig initialisiert oder was auch immer. Bei C++ bin ich noch sehr unbeholfen was das angeht.</p>
<p>CartItem.h</p>
<pre><code class="language-cpp">#ifndef CARTITEM_H
#define CARTITEM_H
#include &lt;string&gt;
class CartItem {
    private:
        std::string name;
        int quantity;
        double pricePerUnit;

    public:
        CartItem(const std::string name,const int quant,const double price);
        double getCost();
        std::string getName();
        int getQuantity();
        double getPricePerUnit();
        void setQuantity(const int n);
        void setPricePerUnit(const double price);
        void setName(const std::string name);
};
#endif
</code></pre>
<p>CartItem.cpp</p>
<pre><code class="language-cpp">#include &quot;CartItem.h&quot;

CartItem::CartItem(const std::string name, const int quant, const double price) {
    setName(name);
    setQuantity(quant);
    setPricePerUnit(price);
}

double CartItem::getCost() {
    return quantity*pricePerUnit;
}

std::string CartItem::getName() {
    return name;
}

int CartItem::getQuantity() {
    return quantity;
}

double CartItem::getPricePerUnit() {
    return pricePerUnit;
}

void CartItem::setQuantity(const int n) {
    quantity = n;
}

void CartItem::setPricePerUnit(const double price) {
    pricePerUnit = price;
}

void CartItem::setName(const std::string name) {
    this-&gt;name = name;
}
</code></pre>
<p>ShoppingCart.h</p>
<pre><code class="language-cpp">#ifndef SHOPPINGCART_H
#define SHOPPINGCART_H
#include &lt;vector&gt;
#include &quot;CartItem.h&quot;
class ShoppingCart {
    private:
        std::vector&lt;CartItem&gt; contentList;
    public:
        ShoppingCart();
        void add(const CartItem item);
        double getTotalCost();
        int getNumberOfItems();
        CartItem getItem(const int i);
};
#endif
</code></pre>
<p>ShoppingCart.cpp</p>
<pre><code class="language-cpp">#include &quot;ShoppingCart.h&quot;

/*ShoppingCart::ShoppingCart() {

}*/

void ShoppingCart::add(const CartItem item) {
    contentList.push_back(item);
}

double ShoppingCart::getTotalCost() {
    double totalCost=0;
    for(unsigned int i=0; i&lt;contentList.size(); i++) {
        totalCost += contentList.at(i).getCost();
    }
    return totalCost;
}

int ShoppingCart::getNumberOfItems() {
    return contentList.size();
}

CartItem ShoppingCart::getItem(const int i) {
    return contentList.at(i);
}
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;ShoppingCart.h&quot;
#include &quot;CartItem.h&quot;

using namespace std;

int main() {
    ShoppingCart* cart = new ShoppingCart();
    CartItem* hundefutter = new CartItem(&quot;Hundefutter&quot;, 6, 3.20);
    CartItem* kekse = new CartItem(&quot;Kekse&quot;, 4, 1.59);
    CartItem* milch = new CartItem(&quot;Milch&quot;, 1, 0.69);
    CartItem* marmelade = new CartItem(&quot;Erdbeerkonfituere&quot;, 3, 2.19);
    cart.add(hundefutter);
    cart.add(kekse);
    cart.add(milch);
    cart.add(marmelade);
    cout &lt;&lt; cart.getTotalCost();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2155170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155170</guid><dc:creator><![CDATA[Jolka]]></dc:creator><pubDate>Fri, 09 Dec 2011 20:30:11 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Fri, 09 Dec 2011 20:38:11 GMT]]></title><description><![CDATA[<p>Cart ist ein Zeiger. Nim den Pfeiloperator.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;ShoppingCart.h&quot;
#include &quot;CartItem.h&quot;

using namespace std;

int main() {
    ShoppingCart* cart = new ShoppingCart();
    CartItem* hundefutter = new CartItem(&quot;Hundefutter&quot;, 6, 3.20);
    CartItem* kekse = new CartItem(&quot;Kekse&quot;, 4, 1.59);
    CartItem* milch = new CartItem(&quot;Milch&quot;, 1, 0.69);
    CartItem* marmelade = new CartItem(&quot;Erdbeerkonfituere&quot;, 3, 2.19);
    cart-&gt;add(hundefutter);
    cart-&gt;add(kekse);
    cart-&gt;add(milch);
    cart-&gt;add(marmelade);
    cout &lt;&lt; cart-&gt;getTotalCost();
    delete cart;
    delete hundefutter;
    delete kekse;
    delete milch;
    delete marmelade;
}
</code></pre>
<p>Und vergiss nicht, den Speicher freizugeben! Keine Garbage-Collection!! :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155171</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 09 Dec 2011 20:38:11 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Fri, 09 Dec 2011 21:04:40 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Cart ist ein Zeiger. Nim den Pfeiloperator.</p>
<p>...</p>
<p>Und vergiss nicht, den Speicher freizugeben! Keine Garbage-Collection!! :xmas1:</p>
</blockquote>
<p>Nein. Mach das stattdessen gar nicht erst so. Du machst Java in C++. Wenn du new in C++ benutzt ohne einen besonderen Grund, dann machst du etwas falsch.</p>
<pre><code class="language-cpp">int main() {
    ShoppingCart cart;
    CartItem hundefutter(&quot;Hundefutter&quot;, 6, 3.20);
    CartItem kekse(&quot;Kekse&quot;, 4, 1.59);
    CartItem milch(&quot;Milch&quot;, 1, 0.69);
    CartItem marmelade(&quot;Erdbeerkonfituere&quot;, 3, 2.19);
    cart.add(hundefutter);
    cart.add(kekse);
    cart.add(milch);
    cart.add(marmelade);
    cout &lt;&lt; cart.getTotalCost();
}
</code></pre>
<p>Oder unnötige Zwischenwerte:</p>
<pre><code class="language-cpp">int main() {
    ShoppingCart cart;
    cart.add(CartItem(&quot;Hundefutter&quot;, 6, 3.20));
    cart.add(CartItem(&quot;Kekse&quot;, 4, 1.59));
    cart.add(CartItem(&quot;Milch&quot;, 1, 0.69));
    cart.add(CartItem(&quot;Erdbeerkonfituere&quot;, 3, 2.19));
    cout &lt;&lt; cart.getTotalCost();
}
</code></pre>
<p>P.S.: Es gibt auch noch ein paar andere Kleinigkeiten:</p>
<ul>
<li>Member initialisiert man in einer <em>Initialisierungsliste</em></li>
<li>const bei den Argumenten einer Funktion ist sehr ungewöhnlich, da es Implementierungsdetails der Funktion nach außen trägt. Das mach man normalerweise nur, wenn sich das const auf das Ziel einer Referenz oder eines Pointers bezieht, weil es dann für den Aufrufer relevant ist. Sprich:</li>
</ul>
<pre><code class="language-cpp">void foo(const double bar);
</code></pre>
<p>Die Funktion foo kann ihren Parameter intern nicht ändern. Interessiert niemanden</p>
<pre><code class="language-cpp">void foo(const double&amp; bar);
</code></pre>
<p>Die Funktion foo kann über die Referenz bar den übergebenen Wert nicht ändern. Das ist wichtig.</p>
<ul>
<li>Apropos Referenz: Üblicherweise übergibt man komplexe Datentypen bei denen Kopien teuer werden könnten per (const) Referenz. Zum Beispiel die Strings bei dir.</li>
</ul>
<p>Ansonsten sieht das schon recht gut aus. Die Memberfunktionen machen für meinen Geschmack noch zu wenig, aber das ist ein guter Anfang.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155174</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 09 Dec 2011 21:04:40 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Fri, 09 Dec 2011 20:57:34 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<p>Cart ist ein Zeiger. Nim den Pfeiloperator.</p>
<p>...</p>
<p>Und vergiss nicht, den Speicher freizugeben! Keine Garbage-Collection!! :xmas1:</p>
</blockquote>
<p>Nein. Mach das stattdessen gar nicht erst so. Du machst Java in C++. Wenn du new in C++ benutzt ohne einen besonderen Grund, dann machst du etwas falsch.</p>
</blockquote>
<p>Wollt ich auch schreiben, erschien mir aber komisch.<br />
Ist es nicht so, das man in Java alle Objekte mit new reservieren <strong>muss</strong>? (sry, ich hab keine Ahnung von Java)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155175</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 09 Dec 2011 20:57:34 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Fri, 09 Dec 2011 22:33:40 GMT]]></title><description><![CDATA[<p>Aaaah ok. Danke sehr. Es klappt.<br />
Zwar meckert der Compiler unter CodeBlocks zwar immer noch wegen undefined references herum, aber wenn ich es mit der Konsole kompiliere und linke klappt alles wunderbar. Versteh ich zwar nicht, aber ok.</p>
<p>@Hacker: Ja, bei Java werden alle Objekte immer mit new erzeugt. Und sowas wie reservieren hört man bei Java meines Wissens nach auch garnicht. Java ist nicht so hardwarenah, dass man irgendwas von irgendwelchen Reservierungen zu wissen braucht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Dass das const doch nur bei Referenzen Sinn macht leuchtet mir jetzt ein. Danke.</p>
<p>Noch ein paar Fragen:</p>
<p>Der normale Konstruktor sieht also so aus:<br />
CartItem meinItem(&quot;Argument String&quot;, argumentInt, argumentDouble);</p>
<p>Was macht...<br />
CartItem meinItem = new CartItem(&quot;Argument String&quot;, argumentInt, argumentDouble);<br />
...dann?</p>
<p>@Hacker: Die Zeiger sind jetzt zwar weg und das Freigeben des Speichers wird damit unnötig, aber nur nochmal eine Frage zum Verständnis: Ich muss bzw. sollte den Speicher von Zeigern auch freigeben, wenn das Programm kurz darauf endet? Wird der Speicher nach Programmende nicht automtisch freigegeben, weil der Prozess zu Ende ist?</p>
<p>Zum Abschluss nochmal mein neue Code. Wenn ihr noch irgendwelche Kleinigkeiten findet, die man besser machen könnte immer raus damit. Außer jetzt die einzelnen CartItem-Objekte nicht in Variablen zwischenzuspeichern, sondern direkt bei der Parameterübergabe zu erzeugen. Das weiß ich ja schon. <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>CartItem.h</p>
<pre><code class="language-cpp">#ifndef CARTITEM_H
#define CARTITEM_H
#include &lt;string&gt;
class CartItem {
    private:
        std::string name;
        int quantity;
        double pricePerUnit;

    public:
        CartItem(const std::string &amp;name, int quant, double price);
        double getCost();
        std::string getName();
        int getQuantity();
        double getPricePerUnit();
        void setQuantity(int n);
        void setPricePerUnit(double price);
        void setName(std::string name);
};
#endif
</code></pre>
<p>CartItem.cpp</p>
<pre><code class="language-cpp">#include &quot;CartItem.h&quot;

CartItem::CartItem(const std::string &amp;name, int quant, double price) {
    setName(name);
    setQuantity(quant);
    setPricePerUnit(price);
}

double CartItem::getCost() {
    return quantity*pricePerUnit;
}

std::string CartItem::getName() {
    return name;
}

int CartItem::getQuantity() {
    return quantity;
}

double CartItem::getPricePerUnit() {
    return pricePerUnit;
}

void CartItem::setQuantity(int n) {
    quantity = n;
}

void CartItem::setPricePerUnit(double price) {
    pricePerUnit = price;
}

void CartItem::setName(std::string name) {
    this-&gt;name = name;
}
</code></pre>
<p>ShoppingCart.h</p>
<pre><code class="language-cpp">#ifndef SHOPPINGCART_H
#define SHOPPINGCART_H
#include &lt;vector&gt;
#include &quot;CartItem.h&quot;
class ShoppingCart {
    private:
        std::vector&lt;CartItem&gt; contentList;
    public:
        ShoppingCart();
        void add(const CartItem &amp;item);
        double getTotalCost();
        int getNumberOfItems();
        CartItem getItem(int i);
};
#endif
</code></pre>
<p>ShoppingCart.cpp</p>
<pre><code class="language-cpp">#include &quot;ShoppingCart.h&quot;

void ShoppingCart::add(const CartItem &amp;item) {
    contentList.push_back(item);
}

double ShoppingCart::getTotalCost() {
    double totalCost=0;
    for(unsigned int i=0; i&lt;contentList.size(); i++) {
        totalCost += contentList.at(i).getCost();
    }
    return totalCost;
}

int ShoppingCart::getNumberOfItems() {
    return contentList.size();
}

CartItem ShoppingCart::getItem(int i) {
    return contentList.at(i);
}
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;ShoppingCart.h&quot;
#include &quot;CartItem.h&quot;

using namespace std;

int main() {
    ShoppingCart cart;
    CartItem hundefutter(&quot;Hundefutter&quot;, 6, 3.20);
    CartItem kekse(&quot;Kekse&quot;, 4, 1.59);
    CartItem milch(&quot;Milch&quot;, 1, 0.69);
    CartItem marmelade(&quot;Erdbeerkonfituere&quot;, 3, 2.19);
    cart.add(hundefutter);
    cart.add(kekse);
    cart.add(milch);
    cart.add(marmelade);
    cout &lt;&lt; cart.getTotalCost();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2155211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155211</guid><dc:creator><![CDATA[Jolka]]></dc:creator><pubDate>Fri, 09 Dec 2011 22:33:40 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Fri, 09 Dec 2011 22:42:52 GMT]]></title><description><![CDATA[<p>1. Speicher gibt man bei Objekten frei, dessen Speicher man vom Heap reserviert hat. Einfachste Form:</p>
<pre><code class="language-cpp">int* o = new int[5];
</code></pre>
<p>Danach muss, wenn du weißt dass das Programm sich schließt, der Speicher (in diesem Fall mit delete[], wegen Array - google delete operator) freigegeben werden:</p>
<pre><code class="language-cpp">delete [] o;
</code></pre>
<p>Z.B. hast du ne Klasse, die so aussieht:</p>
<pre><code class="language-cpp">#include &lt;stdexcept&gt;

template&lt;class type&gt;
class Array
{
    type* arr;
    std::size_t len;

public:

    Array(const std::size_t&amp; l) : arr(new type[l]), len(l){} //Reservierung

    Array(const Array&amp; ref)
    {
        *this = ref;
    }

    ~Array() { delete [] arr;} //Freigabe

    Array&amp; operator=(const Array&amp; ref)
    {
        this-&gt;~Array();
        len = ref.len;
        arr = new type[len];// Reservierung
        for(std::size_t ct(0);ct &lt; len; ++ct)
            arr[ct] = ref.arr[ct];
    }

    type&amp; operator[](const std::size_t&amp; index) throw(std::out_of_range)
    {
        if(index &gt; len - 1)
            throw std::out_of_range(&quot;No such index&quot;);
        return arr[index];
    }
};
</code></pre>
<p>Änder ich jetzt nicht mehr, sollte nur ein Beispiel sein :xmas1:</p>
<p>2. Du musst nur dann Speicher freigeben, wenn du ihn selbst reserviert hast. Bei normalen Variablen, deren Speicher vom Stack kommt haben automatisch das hier:</p>
<pre><code class="language-cpp">int a = 0;  // dasselbe wie
auto int a = 0;// auto unnötig
</code></pre>
<p>Speicher reservierung und freigabe sind automatisiert (in C++11 übernimmt dieses Schlüsselwort automatic type deduction).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155213</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 09 Dec 2011 22:42:52 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Fri, 09 Dec 2011 22:50:23 GMT]]></title><description><![CDATA[<p>Jolka schrieb:</p>
<blockquote>
<p>Der normale Konstruktor sieht also so aus:<br />
CartItem meinItem(&quot;Argument String&quot;, argumentInt, argumentDouble);</p>
</blockquote>
<p>Ja, das ist dann ein automatisches Objekt. Das lebt solange wie die eckigen Klammern drumherum und wird, wenn diese verlassen werden, automatisch zerstört. Das ist ungeheuer praktisch, weil das sehr schnell ist und auch meistens das ist, was man möchte. Daher braucht's in C++ auch keinen Garbage Collector. Die Objekte werden streng deterministisch zerstört. Und noch ein ganz dicker Vorteil dieses automatischen Zerstörens: Wenn ich von Zerstören rede, dann meine ich, dass der Destruktor aufgerufen wird. Das heißt, es wird eine Funktion automatisch aufgerufen, wenn das Objekt den Fokus verlässt und diese Funktion kann man selber schreiben. Dies ermöglicht es, Klassen zu schreiben, die automatisch hinter sich aufräumen. Die Standardbibliothek macht das schon so. Dateistreams schließen sich automatisch, Containerklassen geben ihren Speicher frei, usw. Dieses Konzept nennt man <em>RAII</em>.</p>
<blockquote>
<p>Was macht...<br />
CartItem meinItem = new CartItem(&quot;Argument String&quot;, argumentInt, argumentDouble);<br />
...dann?</p>
</blockquote>
<p>Hier hingegen übernimmt der Programmierer die Verantwortung für die Lebensdauer des Objekts. Dies kann nützlich sein, wenn man sehr spezielle Anforderungen an die Lebensdauer eines Objekts hat oder auch unter manchen anderen Umständen. Das Objekt wird erst dann und nur dann zerstört, wenn ein passendes delete aufgerufen wird. Außerdem ist die Technik meistens deutlich langsamer, das Standard-new ist ziemlich lahm (es gibt gute technische Gründe dafür, das ist keine böse Absicht). Wenn man so etwas macht, dann kombiniert man dies oftmals mit dem oben genannten RAII-Idiom, indem man nicht einfach einen Pointer auf das Objekt zeigen lässt, sondern eine komplexe Pointerklasse, die das Objekt unter definierten Umständen automatisch zerstört, z.B. wenn der letzte Zeiger auf das Objekt aus dem Fokus geht. Die Standardbibliothek bietet bereits eine Reihe fertiger Pointerklassen für verschiedene Anwendungsgebiete.</p>
<blockquote>
<p>@Hacker: Die Zeiger sind jetzt zwar weg und das Freigeben des Speichers wird damit unnötig, aber nur nochmal eine Frage zum Verständnis: Ich muss bzw. sollte den Speicher von Zeigern auch freigeben, wenn das Programm kurz darauf endet? Wird der Speicher nach Programmende nicht automtisch freigegeben, weil der Prozess zu Ende ist?</p>
</blockquote>
<p>Nur die automatischen Variablen werden am Ende automatisch <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="😉"
    /> freigegeben (außer bei ganz brutalen Programmabbrüchen, z.B. Abstürzen oder dem Aufruf von abort). Wenn es zu einem new kein delete gab, dann wird dieses ausdrücklich nicht freigegeben. Zumindest nicht von deinem Programm. Du darfst aber davon ausgehen, dass ein eventuelles Betriebssystem sich allen Speicher von einem Prozess automatisch zurückholt, wenn dieser beendet. Das muss aber nicht so sein. Bei sehr alten oder bei extrem einfach gebauten Systemen ist das eventuell nicht so. Daher: Mach es immer sauber. Anders ist unsauber und mangelt an Eleganz. Du wirst feststellen, dass es mit den genannten Techniken sehr einfach ist, absolut fehlerfreie Programme zu schreiben. Außerdem wirst du dadurch ein besserer Programmierer.</p>
<p><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="⚠"
    /> Und lass dich nicht von Hackers Beispielen verwirren. Ganz besonders new[] (also new für Arrays) brauchst du wirklich überhaupt <strong>nie</strong> in C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155217</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 09 Dec 2011 22:50:23 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Fri, 09 Dec 2011 23:37:36 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Array(const Array&amp; ref)
    {
        *this = ref;
    }
</code></pre>
</blockquote>
<p>Vor dem *this = ref; erstmal arr = 0 setzen wäre angesagt. Sonst schnalzt es an der Stelle.</p>
<p>Hacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Array&amp; operator=(const Array&amp; ref)
    {
        this-&gt;~Array();
        len = ref.len;
        arr = new type[len];// Reservierung
        for(std::size_t ct(0);ct &lt; len; ++ct)
            arr[ct] = ref.arr[ct];
    }
</code></pre>
</blockquote>
<p>this-&gt;~Array(); ... AUA!<br />
Ich bin mir fast sicher dass das laut Standard nicht OK ist.<br />
Und selbst wenn, eine kleine Hilfsfunktion die du hier sowie im Dtor aufrufst wäre wirklich kein Overkill.<br />
Und natürlich ist das ganze nicht Exception-safe. Copy &amp; Swap wäre hier IMO angesagt, bzw. ansonsten etwas in der Art wie...</p>
<pre><code class="language-cpp">void Clear()
    {
        delete [] arr;
        arr = 0;
        len = 0;
    }

    Array&amp; operator=(const Array&amp; other)
    {
        Clear();
        arr = new type[other.len]; // erst arr setzen, damit verbleibt das Objekt immer in einem gültigen Zustand, auch wenn es hier schnaltz
        len = other.len;           // würde man erst len setzen, könnte man arr = 0, len = 42 haben - was dann zu Problemen im operator[] führen könnte
        for (std::size_t i = 0; i &lt; len; i++)
            arr[i] = other.arr[i];
    }
</code></pre>
<p>Hacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">type&amp; operator[](const std::size_t&amp; index) throw(std::out_of_range)
    {
        if(index &gt; len - 1)
            throw std::out_of_range(&quot;No such index&quot;);
        return arr[index];
    }
};
</code></pre>
</blockquote>
<p>Und was wenn len == 0? Wieso nicht einfach if (index &gt;= len)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155224</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 09 Dec 2011 23:37:36 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 04:11:57 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void Clear()
    {
        delete [] arr;
        arr = 0;
        len = 0;
    }

    Array&amp; operator=(const Array&amp; other)
    {
        Clear();
        arr = new type[other.len]; // erst arr setzen, damit verbleibt das Objekt immer in einem gültigen Zustand, auch wenn es hier schnaltz
        len = other.len;           // würde man erst len setzen, könnte man arr = 0, len = 42 haben - was dann zu Problemen im operator[] führen könnte
        for (std::size_t i = 0; i &lt; len; i++)
            arr[i] = other.arr[i];
    }
</code></pre>
</blockquote>
<p>Ist auch nicht Exception-safe. Besser:</p>
<pre><code class="language-cpp">void Clear()
{
    delete[] arr;
    arr = 0;
    len = 0;
}

Array&amp; operator = (Array const&amp; other)
{
    type* ptr = new type[other.len]; // Gleich mal als erstes den Speicher allozieren, um die starke Garantie geben zu können
    Clear();
    arr = ptr;
    len = other.len;
    std::copy(other.begin(), other.end(), arr);
    return *this;
}
</code></pre>
<p>Der Nachteil besteht wohl darin, dass kurzzeitig der doppelte Speicher gebraucht wird, was dann ziemlich knapp wird, wenn man sehr große solche Arrays verwendet.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">type&amp; operator[](const std::size_t&amp; index) throw(std::out_of_range)
    {
        if(index &gt; len - 1)
            throw std::out_of_range(&quot;No such index&quot;);
        return arr[index];
    }
};
</code></pre>
</blockquote>
<p>Und was wenn len == 0? Wieso nicht einfach if (index &gt;= len)?</p>
</blockquote>
<p>Die Frage sollte eher lauten, was das throw(std::out_of_range) da soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155258</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 10 Dec 2011 04:11:57 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 08:02:05 GMT]]></title><description><![CDATA[<p>Was werfen denn String und Vector, wenn du</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; a(10);

a.at(20);
</code></pre>
<p>machst?</p>
<p>MEIN Gott, es war nur ein Beispiel. :xmas1:</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>: an index &gt;= len hab ich doch so schnell nicht gedacht. Es war nur hingekrizelt. Außerdem hast du aber recht, std::size_t ist unsigned...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155270</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 10 Dec 2011 08:02:05 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 15:10:24 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Was werfen denn String und Vector, wenn du</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; a(10);

a.at(20);
</code></pre>
<p>machst?</p>
</blockquote>
<p>Er meinte mit Sicherheit das<br />
<code>type&amp; operator[](const std::size_t&amp; index) throw(std::out_of_range)</code><br />
es gibt schon 12387 diskussionen über exception specifications, aber bisher kam man glaube ich jedes mal auf den schluss, lieber<br />
<code>type&amp; operator[](const std::size_t&amp; index) /*throw(std::out_of_range)*/</code><br />
zu schreiben.</p>
<p>bb</p>
<p>edit: copy&amp;swap wäre zu einfach?</p>
<pre><code class="language-cpp">#include &lt;stdexcept&gt; 

template&lt;class type&gt; 
class Array 
{ 
    type* arr; 
    std::size_t len; 

public: 

    Array(const std::size_t&amp; l)
    :   arr(new type[l]),
        len(l)
    {}

    Array(const Array&amp; ref)
    :   arr(new type[ref.l]),
        len(ref.l)
    { 
        try
        {
            std::copy(ref.l, ref.l+ref.len, arr);
        }
        catch(...)
        {
            clear();
            throw;
        }
    } 

    void clear()
    {
        delete[] arr;
    }

    ~Array()
    {
        clear();
    }

    void swap(Array&amp; ref)
    {
        using std::swap;
        swap(l, ref.l);
        swap(arr, ref.arr);
    }

    Array&amp; operator=(const Array&amp; ref)
    {
        Array tmp(ref);
        tmp.swap(*this);
        return *this;
    }

    type&amp; operator[](const std::size_t&amp; index)
    {
        assert(index &gt;= len);
        return arr[index]; 
    } 

    type&amp; at(const std::size_t&amp; index) /*throw(std::out_of_range)*/
    {
        if(index &gt;= len)
            throw std::out_of_range(&quot;No such index&quot;); 
        return this-&gt;operator[](index); 
    } 
};
</code></pre>
<p>wer auf die idee kommt, immer <code>l</code> für länge/length zu nutzen... so was unleserliches...<br />
ref find ich auch nicht gerade aussagekräftig, aber ich habs bei swap mal auch so gemcaht - normalerweise nehm ich bei so etwas <code>other</code> .</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155398</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 10 Dec 2011 15:10:24 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 15:06:17 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<p>Was werfen denn String und Vector, wenn du</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; a(10);

a.at(20);
</code></pre>
<p>machst?</p>
</blockquote>
<p>Er meinte mit Sicherheit das<br />
<code>type&amp; operator[](const std::size_t&amp; index) throw(std::out_of_range)</code><br />
es gibt schon 12387 diskussionen über exception specifications, aber bisher kam man glaube ich jedes mal auf den schluss, lieber<br />
<code>type&amp; operator[](const std::size_t&amp; index) /*throw(std::out_of_range)*/</code><br />
zu schreiben.</p>
<p>bb</p>
</blockquote>
<p>Ah, gut! Danke werds mir merken :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155403</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 10 Dec 2011 15:06:17 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 15:07:33 GMT]]></title><description><![CDATA[<p>Zumal es nun sogar offiziell deprecated ist, das so zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155404</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 10 Dec 2011 15:07:33 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 18:55:55 GMT]]></title><description><![CDATA[<p>Quatsch, mal wieder, leider.</p>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void Clear()
    {
        delete [] arr;
        arr = 0;
        len = 0;
    }

    Array&amp; operator=(const Array&amp; other)
    {
        Clear();
        arr = new type[other.len]; // erst arr setzen, damit verbleibt das Objekt immer in einem gültigen Zustand, auch wenn es hier schnaltz
        len = other.len;           // würde man erst len setzen, könnte man arr = 0, len = 42 haben - was dann zu Problemen im operator[] führen könnte
        for (std::size_t i = 0; i &lt; len; i++)
            arr[i] = other.arr[i];
    }
</code></pre>
</blockquote>
<p>Ist auch nicht Exception-safe. Besser:</p>
<pre><code class="language-cpp">void Clear()
{
    delete[] arr;
    arr = 0;
    len = 0;
}

Array&amp; operator = (Array const&amp; other)
{
    type* ptr = new type[other.len]; // Gleich mal als erstes den Speicher allozieren, um die starke Garantie geben zu können
    Clear();
    arr = ptr;
    len = other.len;
    std::copy(other.begin(), other.end(), arr);
    return *this;
}
</code></pre>
</blockquote>
<p>Erklär mir mal bitte wo mein Code nicht exception-safe ist.</p>
<p>Er erfüllt die &quot;basic guarantee&quot;: das Objekt verbleibt auf jeden Fall in einem gültigen Zustand, und es gibt keine Leaks. Dass der gültige Zustand im Fall eine Exception nicht unbedingt dem entspricht, was sich der Aufrufer erwartet, ist für die &quot;basic guarantee&quot; vollkommen irrelevant.</p>
<p>Dein Code dagegen versucht die &quot;strong guarantee&quot; zu geben, scheitert dabei aber kläglich. Nämlich genau dann, wenn std::copy() eine Exception wirft. Was ja ohne weiteres sein kann, da es sich um ein Template handelt, und type::operator = ja Exceptions werfen kann. Dann ist nämlich ein Teil des Arrays kopiert, ein Teil aber nicht (=Elemente wurden Default-Initialisiert, aber danach nicht zugewiesen).</p>
<p>Wenn man die &quot;strong guarantee&quot; geben will, dann nimmt man am besten Copy &amp; Swap dafür. Was ich ja auch schon angesprochen hatte.</p>
<p>ps: streng genommen hab ich sogar einen Fehler in meinem Code, den du auch nicht ausgebessert hast: es dürfen ja auch Destruktoren Exceptions werfen. Das ist zwar ganz viel pfui, aber grundsätzlich erlaubt. D.h. Clear() könnte (sollte?) man vielleicht folgendermassen anpassen:</p>
<pre><code class="language-cpp">void Clear()
    {
        type* to_delete = arr;
        arr = 0;
        len = 0;
        delete [] to_delete;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2155462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155462</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 10 Dec 2011 18:55:55 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 19:09:50 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16305">@unskilled</a>:<br />
Naja, copy &amp; swap hatte ich ja schon erwähnt.<br />
Wobei dein Code auch einen Bug hat (neben den Tippfehlern und dem nicht optimalen re-throw im Ctor):</p>
<p>clear() muss schon arr und len auf Null setzen, sonst zerstört es ja die Invarianten.</p>
<p>Und zwecks besserer Optimierbarkeit sollte man den operator = so schreiben:</p>
<pre><code class="language-cpp">Array&amp; operator = (Array other) 
	{ 
		swap(other);
		return *this;
	}
</code></pre>
<p>ps: um das re-throw im Ctor loszuwerden muss man wohl ober übel eine Hilfsklasse verwenden, die das im Destruktor erledigt. Diese Hilfsklasse kann man dann entweder als Basisklasse, Member oder lokalen Guard einbinden (ich würde es vermutlich als Member machen).</p>
<p>Der Sinn ist, dass man kein try-catch braucht. Das hat nämlich Vorteile, wenn die Exception nirgends gefangen wird. Dann bleibt der Debugger nämlich dort stehen, wo die &quot;primäre&quot; Exception geworfen wird, und nicht beim &quot;throw;&quot; in deinem catch-Handler.<br />
Weiters führt es (je nach Compiler) dazu, dass beim &quot;freien&quot; Ausführen des Programms kein (teilweises) Stack-Unwinding mehr gemacht wird, bevor das Programm abgebrochen wird, was auch Vorteile haben kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155467</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 10 Dec 2011 19:09:50 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 19:12:07 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Quatsch, mal wieder, leider.</p>
</blockquote>
<p>Es heißt &quot;Quark, mal wieder, leider.&quot;. Installier dir das Script oder spar's dir.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Er erfüllt die &quot;basic guarantee&quot;: das Objekt verbleibt auf jeden Fall in einem gültigen Zustand, und es gibt keine Leaks. Dass der gültige Zustand im Fall eine Exception nicht unbedingt dem entspricht, was sich der Aufrufer erwartet, ist für die &quot;basic guarantee&quot; vollkommen irrelevant.</p>
</blockquote>
<p>Warum die basic guarantee geben, wenn man strong geben kann? Depp.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Dein Code dagegen versucht die &quot;strong guarantee&quot; zu geben, scheitert dabei aber kläglich. Nämlich genau dann, wenn std::copy() eine Exception wirft. Was ja ohne weiteres sein kann, da es sich um ein Template handelt, und type::operator = ja Exceptions werfen kann. Dann ist nämlich ein Teil des Arrays kopiert, ein Teil aber nicht (=Elemente wurden Default-Initialisiert, aber danach nicht zugewiesen).</p>
</blockquote>
<p>Daran habe ich nicht gedacht, da hast du Recht. Trotzdem ist mein Code schon ne Stufe besser als deiner.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>ps: streng genommen hab ich sogar einen Fehler in meinem Code, den du auch nicht ausgebessert hast: es dürfen ja auch Destruktoren Exceptions werfen. Das ist zwar ganz viel pfui, aber grundsätzlich erlaubt. D.h. Clear() könnte (sollte?) man vielleicht folgendermassen anpassen:</p>
</blockquote>
<p>Quatsch. Wenn jemand Exceptions in Dtoren wirft, ist er selbst schuld. Auch die Standardcontainer geben in so einem Fall keine Garantien mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155471</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 10 Dec 2011 19:12:07 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 19:13:51 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void Clear()
    {
        delete [] arr;
        arr = 0;
        len = 0;
    }

    Array&amp; operator=(const Array&amp; other)
    {
        Clear();
        arr = new type[other.len]; // erst arr setzen, damit verbleibt das Objekt immer in einem gültigen Zustand, auch wenn es hier schnaltz
        len = other.len;           // würde man erst len setzen, könnte man arr = 0, len = 42 haben - was dann zu Problemen im operator[] führen könnte
        for (std::size_t i = 0; i &lt; len; i++)
            arr[i] = other.arr[i];
    }
</code></pre>
</blockquote>
<p>Plus Check auf Selbstzuweisung, weil sonst die Selbstzuweisung arr leert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155474</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 10 Dec 2011 19:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 19:17:32 GMT]]></title><description><![CDATA[<p>Quark, mal wieder, leider.</p>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Warum die basic guarantee geben, wenn man strong geben kann? Depp.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Dein Code dagegen versucht die &quot;strong guarantee&quot; zu geben, scheitert dabei aber kläglich.[...]</p>
</blockquote>
<p>Daran habe ich nicht gedacht, da hast du Recht.</p>
</blockquote>
<p>Fällt dir nichts aus? Oder warst du zu sehr damit beschäftigt, Schimpfwörter zu wählen? Man sieht mal wieder, dass deine guten Vorsätze nicht von weit her sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155476</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 10 Dec 2011 19:17:32 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 19:17:49 GMT]]></title><description><![CDATA[<p>*gähn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155477</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 10 Dec 2011 19:17:49 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 19:20:19 GMT]]></title><description><![CDATA[<p>Man kann kaum glauben, dass du mal rumgeheult hast, dass du nicht verstehst, warum du unbeliebt bist, und dass du ja eigentlich ein ganz Freundlicher bist und in Zukunft nett sein willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155478</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 10 Dec 2011 19:20:19 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 19:32:42 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20068">@Michael</a> E.:<br />
Ja, check auf Selbstzuweisung wäre gut. Hab ich nicht dran gedacht. Danke für den Hinweis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155483</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 10 Dec 2011 19:32:42 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 19:59:10 GMT]]></title><description><![CDATA[<p>Wie man in den Wald hineinruft, so schallt es wieder raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155492</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 10 Dec 2011 19:59:10 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 20:11:32 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Wie man in den Wald hineinruft, so schallt es wieder raus.</p>
</blockquote>
<p>Ich hab nichts gegen Leute die Selbstgespräche führen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155497</guid><dc:creator><![CDATA[talktoyou]]></dc:creator><pubDate>Sat, 10 Dec 2011 20:11:32 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 20:37:33 GMT]]></title><description><![CDATA[<p>talktoyou schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Wie man in den Wald hineinruft, so schallt es wieder raus.</p>
</blockquote>
<p>Ich hab nichts gegen Leute die Selbstgespräche führen.</p>
</blockquote>
<p>Ich hab auch nichts gegen Leute die Leute die Selbstgespräche führen auf eine subtile Weise kritisieren, nein ganz und gar nicht :xmas1: :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155506</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 10 Dec 2011 20:37:33 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 21:26:20 GMT]]></title><description><![CDATA[<p>Ist die Kiddierunde jetzt bald komplett? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2155521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155521</guid><dc:creator><![CDATA[jklkl]]></dc:creator><pubDate>Sat, 10 Dec 2011 21:26:20 GMT</pubDate></item><item><title><![CDATA[Reply to C++ ... unbeholfen bei der Objektorientierung. Fehler beim Client. on Sat, 10 Dec 2011 21:35:47 GMT]]></title><description><![CDATA[<p>jklkl schrieb:</p>
<blockquote>
<p>Ist die Kiddierunde jetzt bald komplett? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Jetzt schon. :xmas1:</p>
<p>Edit: Nein, du hast ja recht :seufz: <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/2155526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2155526</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 10 Dec 2011 21:35:47 GMT</pubDate></item></channel></rss>