<?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[Class mit Feldfunktion]]></title><description><![CDATA[<p>Hallo ihr lieben,</p>
<p>ich brauche eine Array/Liste/Vector Möglichkeit für eine fertige Klasse.<br />
Dafür muss ich Container nehmen, richtig?<br />
Nun, ich bin gerade von C auf C++ umgestiegen und bin in C++ nicht ganz so vertraut, daher weiß ich grad auch nicht so genau, wie das funktionieren soll...<br />
Ich hab gelesen, dass ich ein Array einfach anlegen kann, wenn ich keinen Konstruktor benutze. Aber ich will nicht auf den Konstruktor verzichten, den habe ich gerade sehr lieb gewonnen und er nimmt mir viel Arbeit ab!!! <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>Mit meiner C Überlegung hätte ich für das Struct ein Array mit malloc und Sizeof(struct) reserviert. Ich versuche aber auch von C Gedanken wegzukommen <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="😉"
    /> (Es sei denn, anders gehts nicht.)<br />
Das hier hab ich mir auch durchgelesen <a href="http://www.c-plusplus.net/forum/143816-full" rel="nofollow">http://www.c-plusplus.net/forum/143816-full</a> und Stroustrups C++ Language Buch hab ich auch vor mir liegen. Ich seh den Wald vor lauter Bäumen nicht ^^</p>
<p>Ich brauche nur die Möglichkeit auf ein i.-tes Element zuzugreifen, bzw die Elemente der Reihe nach auszugeben und das Array hinterher zu löschen! Einzelne Elemente zwischendrin löschen oder hinzufügen muss ich nicht.<br />
(Ich denke da immernoch an Pointern ... aber das ist wahrscheinlich wieder so ein C Gedanke <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="😉"
    /> )</p>
<p>Ein Minimalbeispiel (Das ist mein Lernkonstrukt, sagt jetzt nicht, da könnte man doch auf den Konstruktor verzichten. Der eigentliche Code sieht ganz anders aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /> )</p>
<pre><code>#include &lt;iostream&gt; 	
#include &lt;vector&gt;

class PUNKT{
public:
	PUNKT(int px, int py): x(px),y(py) {}		// Auf den Konstruktor kann ich nicht verzichten! 
	void verschiebe(int dx, int dy);
	void ausgabe();
protected:										
	int x,y;
};

void PUNKT::verschiebe(int dx, int dy) {
	x=dx;
	y=dy;
}

void PUNKT::ausgabe() {
	std::cout &lt;&lt; &quot;Punkt &quot; &lt;&lt; x &lt;&lt; &quot;/&quot; &lt;&lt; y &lt;&lt; std::endl;
}

int main(int count, char **args) {

	std::vector&lt;PUNKT&gt; test;		//brauche Möglichkeit für ein Array! Vector geht nicht?! 

	return 0;
}
</code></pre>
<p>Merci <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>(PS beiläufige Frage: Ist es in C++ besser void main zu schreiben? Wenn ja, gilt das für alle Funktionen? Ich denke, wenn ein Prog/Funktion bei Korrektheit return 0 zurückgibt ist besser, oder ist C++ da jetzt anders?)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320543/class-mit-feldfunktion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 23 Jul 2026 18:38:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320543.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Oct 2013 12:44:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 12:47:40 GMT]]></title><description><![CDATA[<p>Hallo ihr lieben,</p>
<p>ich brauche eine Array/Liste/Vector Möglichkeit für eine fertige Klasse.<br />
Dafür muss ich Container nehmen, richtig?<br />
Nun, ich bin gerade von C auf C++ umgestiegen und bin in C++ nicht ganz so vertraut, daher weiß ich grad auch nicht so genau, wie das funktionieren soll...<br />
Ich hab gelesen, dass ich ein Array einfach anlegen kann, wenn ich keinen Konstruktor benutze. Aber ich will nicht auf den Konstruktor verzichten, den habe ich gerade sehr lieb gewonnen und er nimmt mir viel Arbeit ab!!! <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>Mit meiner C Überlegung hätte ich für das Struct ein Array mit malloc und Sizeof(struct) reserviert. Ich versuche aber auch von C Gedanken wegzukommen <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="😉"
    /> (Es sei denn, anders gehts nicht.)<br />
Das hier hab ich mir auch durchgelesen <a href="http://www.c-plusplus.net/forum/143816-full" rel="nofollow">http://www.c-plusplus.net/forum/143816-full</a> und Stroustrups C++ Language Buch hab ich auch vor mir liegen. Ich seh den Wald vor lauter Bäumen nicht ^^</p>
<p>Ich brauche nur die Möglichkeit auf ein i.-tes Element zuzugreifen, bzw die Elemente der Reihe nach auszugeben und das Array hinterher zu löschen! Einzelne Elemente zwischendrin löschen oder hinzufügen muss ich nicht.<br />
(Ich denke da immernoch an Pointern ... aber das ist wahrscheinlich wieder so ein C Gedanke <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="😉"
    /> )</p>
<p>Ein Minimalbeispiel (Das ist mein Lernkonstrukt, sagt jetzt nicht, da könnte man doch auf den Konstruktor verzichten. Der eigentliche Code sieht ganz anders aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /> )</p>
<pre><code>#include &lt;iostream&gt; 	
#include &lt;vector&gt;

class PUNKT{
public:
	PUNKT(int px, int py): x(px),y(py) {}		// Auf den Konstruktor kann ich nicht verzichten! 
	void verschiebe(int dx, int dy);
	void ausgabe();
protected:										
	int x,y;
};

void PUNKT::verschiebe(int dx, int dy) {
	x=dx;
	y=dy;
}

void PUNKT::ausgabe() {
	std::cout &lt;&lt; &quot;Punkt &quot; &lt;&lt; x &lt;&lt; &quot;/&quot; &lt;&lt; y &lt;&lt; std::endl;
}

int main(int count, char **args) {

	std::vector&lt;PUNKT&gt; test;		//brauche Möglichkeit für ein Array! Vector geht nicht?! 

	return 0;
}
</code></pre>
<p>Merci <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>(PS beiläufige Frage: Ist es in C++ besser void main zu schreiben? Wenn ja, gilt das für alle Funktionen? Ich denke, wenn ein Prog/Funktion bei Korrektheit return 0 zurückgibt ist besser, oder ist C++ da jetzt anders?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357302</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Wed, 02 Oct 2013 12:47:40 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 12:52:38 GMT]]></title><description><![CDATA[<p>Schreibe nie void main()!<br />
Der Standard legt fest, dass das int main() sein muss.<br />
Um Fehler von Funktionen zurückzugeben, verwendet man Exceptions, also nur Returncodes wenn du sie auch brauchst.<br />
Zu deinem Problem:<br />
Dein gezeigtes Programm funktioniert einwandfrei.<br />
Das es bei dir nicht klappt, liegt vermutlich daran, dass du für POINT (dämlicher Name, sowas sind idR Makros) keinen Defaultkonstruktor hast.<br />
Entweder du ergänzt denn oder du gibst vector den Konstruktor an, wie das geht, ist davon abhängig, was das Problem ist also zeige ein minimiertes Beispiel was den Fehler reproduziert.</p>
<p>PS: Deine Funktion ausgabe() schreibt man besser als operator &lt;&lt;, dann kannste direkt schreibe:<br />
std::cout &lt;&lt; my_point;<br />
Tutorials dafür findest du jede Menge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357303</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 02 Oct 2013 12:52:38 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 13:02:30 GMT]]></title><description><![CDATA[<p>Achsoooooo danke! <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>Das klappt nun:</p>
<pre><code>#include &lt;iostream&gt; 	
#include &lt;vector&gt;

class PUNKT{
public:
	PUNKT(int px=0, int py=0): x(px),y(py) {}		
	void verschiebe(int dx, int dy);
	void ausgabe();
protected:										
	int x,y;
};

void PUNKT::verschiebe(int dx, int dy) {
	x=dx;
	y=dy;
}

void PUNKT::ausgabe() {
	std::cout &lt;&lt; &quot;Punkt &quot; &lt;&lt; x &lt;&lt; &quot;/&quot; &lt;&lt; y &lt;&lt; std::endl;
}

int main(int count, char **args) {

	std::vector&lt;PUNKT&gt; test;
	test.push_back(PUNKT(2,3));
	test[0].ausgabe();

	return 0;
}
</code></pre>
<p>Danke auch für die anderen Anmerkungen! Da werd ich mich noch reinlesen. <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>Ja, das mit void main hab ich irgendwo in einem Forum gelesen, ich weiß nicht mehr wo. Hab mich auch darüber gewundert ... <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/2357306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357306</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 13:06:12 GMT]]></title><description><![CDATA[<p>Da kommt mir noch eine Frage zu vector:</p>
<p>test.clear();<br />
leert den Vector. Aber gibt es wie in meinem Fall auch den Speicher für die Class Elemente frei oder muss ich das irgendwie abfangen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357308</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 13:08:25 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>PS: Deine Funktion ausgabe() schreibt man besser als operator &lt;&lt;, dann kannste direkt schreibe:<br />
std::cout &lt;&lt; my_point;</p>
</blockquote>
<p>Vom &lt;&lt; bzw. &gt;&gt; -Operator erwarte ich sicherlich nicht, dass er &quot;ausgabe x/y&quot; schreibt/liest.<br />
Da ist eine Funktion schon in Ordnung. Besser wäre allerdings eine Freie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357311</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:08:25 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 13:14:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Aber gibt es wie in meinem Fall auch den Speicher für die Class Elemente frei oder muss ich das irgendwie abfangen?</p>
</blockquote>
<p>Den Speicher, den vector selbst alloziert hat, gibt er natürlich immer frei.</p>
<blockquote>
<p>Vom &lt;&lt; bzw. &gt;&gt; -Operator erwarte ich sicherlich nicht, dass er &quot;ausgabe x/y&quot; schreibt/liest.</p>
</blockquote>
<p>Natürlich reduziert man das entsprechend.</p>
<pre><code>int main(int count, char **args)
</code></pre>
<p>Du musst <code>main()</code> nicht mit diesen Parametern definieren, wenn du keine Kommandozeilenparameter auswerten willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357313</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:14:33 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 13:23:14 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Den Speicher, den vector selbst alloziert hat, gibt er natürlich immer frei.</p>
</blockquote>
<p>Ja, das ist mir klar.<br />
Ruft er dann auch den Destruktor der Klasse automatisch auf?</p>
<p>Edit: sieht ganz danach aus. Wenn ich mal mitzaehle wieoft Konstruktor und Destruktor aufgerufen werden:</p>
<pre><code>#include &lt;iostream&gt; 	
#include &lt;vector&gt;

class PUNKT{
public:
	PUNKT(int px=0, int py=0): x(px),y(py) {++zaehl;}
	~PUNKT() {--zaehl;}
	void verschiebe(int dx, int dy);
	void ausgabe();
protected:										
	int x,y;
	static int zaehl;		// Anzahl der Elemente 
};

int PUNKT::zaehl=1; 

void PUNKT::verschiebe(int dx, int dy) {
	x=dx;
	y=dy;
}

void PUNKT::ausgabe() {
	std::cout &lt;&lt; zaehl &lt;&lt; &quot; Punkt &quot; &lt;&lt; x &lt;&lt; &quot;/&quot; &lt;&lt; y &lt;&lt; std::endl;
}

int main(int count, char **args) {

	std::vector&lt;PUNKT&gt; test;
	test.push_back(PUNKT(2,3));
	test[0].ausgabe();
	test.clear();
	test[0].ausgabe();

	return 0;
}
</code></pre>
<p>Dann brauch ich mir ja keine Sorgen machen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<blockquote>
<p>Du musst main() nicht mit diesen Parametern definieren, wenn du keine Kommandozeilenparameter auswerten willst.</p>
</blockquote>
<p>ich weiß wozu der da ist <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357314</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:23:14 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 13:23:00 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Vom &lt;&lt; bzw. &gt;&gt; -Operator erwarte ich sicherlich nicht, dass er &quot;ausgabe x/y&quot; schreibt/liest.</p>
</blockquote>
<p>Natürlich reduziert man das entsprechend.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Hauptsache irgendwie auf 1000 Beiträge pro Tag kommen...<br />
Er schreibt eine Funktion, die irgendwas wie &quot;Punkt x/y&quot; auf der Konsole ausgeben soll und kriegt als Tipp, dass er dafür den Shift-Operator überschreiben soll.<br />
Den Tipp halte ich für Käse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357318</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:23:00 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 13:29:11 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Vom &lt;&lt; bzw. &gt;&gt; -Operator erwarte ich sicherlich nicht, dass er &quot;ausgabe x/y&quot; schreibt/liest.</p>
</blockquote>
<p>Natürlich reduziert man das entsprechend.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Hauptsache irgendwie auf 1000 Beiträge pro Tag kommen...<br />
Er schreibt eine Funktion, die irgendwas wie &quot;Punkt x/y&quot; auf der Konsole ausgeben soll und kriegt als Tipp, dass er dafür den Shift-Operator überschreiben soll.</p>
</blockquote>
<p>Nicht shift: den ostream operator &lt;&lt;, der es einem ermöglicht Dinge auf ostreams auszugeben!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357323</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:29:11 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 13:43:28 GMT]]></title><description><![CDATA[<blockquote>
<p>Ja, das ist mir klar.</p>
</blockquote>
<p>Was war dann deine Frage?</p>
<blockquote>
<p>Ruft er dann auch den Destruktor der Klasse automatisch auf?</p>
</blockquote>
<p>Natürlich!? Er legt die Elemente standardmäßig mit <code>new</code> an und zerstört sie mit <code>delete</code> . <code>delete</code> ruft natürlich den Destruktor auf.</p>
<blockquote>
<p>Hauptsache irgendwie auf 1000 Beiträge pro Tag kommen...</p>
</blockquote>
<p>Schweig, wenn du nicht angemessener reden kannst.</p>
<blockquote>
<p>Er schreibt eine Funktion, die irgendwas wie &quot;Punkt x/y&quot; auf der Konsole ausgeben soll und kriegt als Tipp, dass er dafür den Shift-Operator überschreiben soll.</p>
</blockquote>
<p>Erstens ist es eine sie, zweitens kann man den Shift-Operator überladen um die Zahlen auszugeben und anschließend eine Funktion die davor noch einen String ausgibt.</p>
<p>Und überhaupt wäre der standardmäßige Tipp, innerhalb der zuständigen Funktion überhaupt nichts zu beschreiben, sondern eben nur die Zahlen auszugeben. Dafür hast du aber natürlich nicht weit genug gedacht, da du nur beschäftigt warst zu nörgeln.</p>
<blockquote>
<p>Nicht shift: den ostream operator &lt;&lt;,</p>
</blockquote>
<p>Das <em>ist</em> der Shift-Operator, so nennt man ihn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357327</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:43:28 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 13:36:43 GMT]]></title><description><![CDATA[<p>Lymogry schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Den Speicher, den vector selbst alloziert hat, gibt er natürlich immer frei.</p>
</blockquote>
<p>Ja, das ist mir klar.<br />
Ruft er dann auch den Destruktor der Klasse automatisch auf?</p>
</blockquote>
<p>Neben deinen eigenen Experimenten noch die Bestätigung: Ja, tut er. Der vector ist, so wie die anderen Standardcontainer, ein Rundum-Sorglos-Paket, mit korrektem Erzeugen, Kopieren und Zerstören. Im Falle des vector ist das ein (recht dicker) Wrapper um ein manuelles new/delete-Paar. new und delete erzeugen und zerstören Objekte vollständig.</p>
<p>Falls es dich interessiert, wie man selber solche Klassen wie den vector schreibt (dein PUNKT ist in dieser Hinsicht nämlich <strong>nicht</strong> korrekt!), die Stichworte dazu sind: RAII und die Regeln der Großen 3 (neuerdings 5). Wieso dein PUNKT nicht korrekt ist:<br />
<a href="https://ideone.com/Qrj8uj" rel="nofollow">https://ideone.com/Qrj8uj</a><br />
Ich habe mal ein paar mehr Objekte in den Vector gepackt. Die resultierende negative Zahl ist kein Fehler im vector, sondern kommt daher, dass deine Testklasse die Regel der Großen 3 nicht beachtet.</p>
<p>So ist es richtig:<br />
<a href="https://ideone.com/ut2UKt" rel="nofollow">https://ideone.com/ut2UKt</a><br />
Neben einigen Detailsverbesserungen und Fehlerkorrekturen (am Anfang hast du 0 Punkte, nicht 1!) geht es vor allem um den Kopierkonstruktor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357331</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:36:43 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 13:39:16 GMT]]></title><description><![CDATA[<p>Was ist denn das, SeppJ:</p>
<pre><code>test.clear();
test[0].ausgabe();
</code></pre>
<p>Das solltest du noch korrigieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357332</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:39:16 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 13:50:18 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Was ist denn das, SeppJ:</p>
<pre><code>test.clear();
test[0].ausgabe();
</code></pre>
<p>Das solltest du noch korrigieren.</p>
</blockquote>
<p>Habe ich doch! Das erste ist noch das Originalprogramm, bloß mit mehr Punkten.</p>
<p>edit: Als Referenz für den Threadersteller, damit er nicht Zeile für Zeile vergleichen braucht:<br />
- Kopierkonstruktor eingefügt<br />
- ausgabe static gemacht, so dass man kein Objekt zur Ausgabe des statischen Zählers braucht<br />
- private statt protected. Der Nutzen von protected ist nur recht beschränkt. Hier ist sicherlich kein Anwendungsszenario dafür. Auch wenn ich weiß, dass man als Anfänger gerne alles protected macht: Wenn du etwas protected machst, kannst du es von der Kapselung her auch gleich public machen. protected brauchst du nur in Szenarien, wo der ganze Zweck deiner Klasse ist, dass man von ihr erbt.<br />
-'\n' statt endl. endl ist '\n' + flush. Ich will hier nicht flushen. Auch sonst will ich praktisch nie die Ausgabe flushen, außer als Prompt vor einer Eingabe. Und dann geschieht das ohnehin schon automatisch.<br />
-Die main den Änderungen in der Klasse angepasst. Beachte, dass nun nicht mehr auf nicht-existierende Elemente zugegriffen wird (dass, das Sone meinte. Nach dem clear gibt es kein 0'tes Element mehr!).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357334</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:50:18 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 13:48:22 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Habe ich doch!</p>
</blockquote>
<p>Oh? Ich bin sicher, ich sah bei deiner korrigierten Variante dasselbe. Ja, bei dir ist es eine statische Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357336</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 02 Oct 2013 13:48:22 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 14:06:22 GMT]]></title><description><![CDATA[<p>Danke schonmal für die Korrekturen Sepp!</p>
<p>hmm hmm ... ich versuche das mit dem Kopierkonstruktor gerade nachzuvollziehen: <a href="http://de.wikipedia.org/wiki/Dreierregel" rel="nofollow">http://de.wikipedia.org/wiki/Dreierregel</a><br />
&quot;Wird das für eine dieser Elemente gemacht, so bedeutet das, dass die compilergenerierte Version des entsprechenden Elements den Anforderungen der Klasse nicht genügt.&quot;<br />
Wenn ich auf einen expliziten Destruktor verzichte, brauche ich diese Regeln nicht zu. Ich hab in dem Beispiel den Destruktor nur mal zum Zählen miteingebaut.</p>
<p>Ist es denn ok, wenn das Program den Vector leert (mit dem default Destruktor) und ich global den zaehler wieder auf 0 setze. Bekomme ich da auch Probleme mit?</p>
<p>Ich lerne hier sehr viel! Vielen Dank an alle! <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/2357346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357346</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Wed, 02 Oct 2013 14:06:22 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 14:17:24 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn ich auf einen expliziten Destruktor verzichte, brauche ich diese Regeln nicht zu.</p>
</blockquote>
<p>... befolgen? Nein, das brauchst du nicht. Das heißt, dass alle Kopier-Operationen auch vom Compiler generiert werden können.</p>
<blockquote>
<p>Ist es denn ok, wenn das Program den Vector leert (mit dem default Destruktor) und ich global den zaehler wieder auf 0 setze. Bekomme ich da auch Probleme mit?</p>
</blockquote>
<p>Welcher Zähler? Nein, damit bekommst du keine Probleme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357350</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 02 Oct 2013 14:17:24 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 14:29:18 GMT]]></title><description><![CDATA[<p>Lymogry schrieb:</p>
<blockquote>
<p>Wenn ich auf einen expliziten Destruktor verzichte, brauche ich diese Regeln nicht zu. Ich hab in dem Beispiel den Destruktor nur mal zum Zählen miteingebaut.</p>
</blockquote>
<p>Die Dreierregel brauchst du hier ausdrücklich nur wegen dem Zähler. Da du für den Zähler korrekterweise einen Destruktor brauchst, brauchst du hier auch einen Kopierkonstruktor, damit Kopien (und der vector macht Kopien!) korrekt gezählt werden. Bei deiner PUNKT-Klasse, wie sie eigentlich geplant ist, brauchst du weder einen eigenen Destruktor noch Kopierkonstruktor.</p>
<blockquote>
<p>Ist es denn ok, wenn das Program den Vector leert (mit dem default Destruktor) und ich global den zaehler wieder auf 0 setze. Bekomme ich da auch Probleme mit?</p>
</blockquote>
<p>Ja, aber wozu ist der Zähler dann noch gut?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357355</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 02 Oct 2013 14:29:18 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 14:33:33 GMT]]></title><description><![CDATA[<p>Aha! <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>Gut, dann noch ein paar Fragen zu deinen Korrekturen: <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="😉"
    /></p>
<pre><code>#include &lt;iostream&gt; 	
#include &lt;vector&gt;

class PUNKT{
public:
	PUNKT(int px=0, int py=0): x(px),y(py) {++zaehl;}				// Konstruktor 
	PUNKT(const PUNKT&amp; other): x(other.x),y(other.y) {++zaehl;}		// Kopierkonstruktor
	~PUNKT() {--zaehl;}												// Destruktor 
								// wo ist der Zuweisungsoperator aus der Dreierregel?? 
	void verschiebe(int dx, int dy);
	void ausgabe();
private:										
	int x,y;
	static int zaehl;		// Anzahl der Elemente 
};

int PUNKT::zaehl=0; 

void PUNKT::verschiebe(int dx, int dy) {
	x=dx;
	y=dy;
}

void PUNKT::ausgabe() {	 			// static für private Dateien??
	std::cout &lt;&lt; zaehl &lt;&lt; &quot; Punkt &quot; &lt;&lt; x &lt;&lt; '/' &lt;&lt; y &lt;&lt; '\n';	
}

int main(int count, char **args) {

	std::vector&lt;PUNKT&gt; test;
	test.push_back(PUNKT(2,3));
	test.push_back(PUNKT(1,1));
	test.push_back(PUNKT(2,6));
	test[0].ausgabe();
	test.clear();
	test.push_back(PUNKT(5,5));
	test[0].ausgabe();

	return 0;
}
</code></pre>
<p><a href="http://de.wikipedia.org/wiki/Dreierregel" rel="nofollow">http://de.wikipedia.org/wiki/Dreierregel</a></p>
<p>Oder ist mit dem Zuweisungsoperator (int px=0, int py=0) aus dem Konstruktor gemeint?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357356</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Wed, 02 Oct 2013 14:33:33 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 14:36:32 GMT]]></title><description><![CDATA[<p>Mit dem Zuweisungsoperator ist der überladene (Kopier-)Zuweisungsoperator der Klasse gemeint:</p>
<pre><code class="language-cpp">class PUNKT {
   ...
   PUNKT&amp; operator=(const PUNKT&amp;);
   ...
};
</code></pre>
<p>Die Dreierregel ist im Übrigen nur eine Faustregel. Und hier ist kein selbstdefinierter Zuweisungsoperator notwendig, weil sich die Anzahl der Objekte bei einer Zuweisung nicht ändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357359</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 02 Oct 2013 14:36:32 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 14:50:12 GMT]]></title><description><![CDATA[<p>Ja, war didaktisch wohl ein bisschen ungünstig, die Dreierregel an dem einen Beispiel zu erklären, wo man wirklich nur zwei von den dreien braucht <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="🙂"
    /> . Der Instanzenzähler ist einer der ganz wenigen Fälle, in denen die Dreierregeln nicht komplett eingehalten werden muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357362</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 02 Oct 2013 14:50:12 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 15:49:53 GMT]]></title><description><![CDATA[<p>Ein klassisches, abstraktes Beispiel: Ich habe einen Zeiger auf eine Ressource als Member. Die Ressource muss freigegeben werden, nachdem sie im Konstruktor erzeugt wurde, und die Klasse muss die Ressource bei Kopien auch kopieren.<br />
Typisches RAII bzw. Regel der großen Drei.</p>
<blockquote>
<p>static für private Dateien??</p>
</blockquote>
<p>Ja, die Sichtbarkeit dehnt sich auf alles aus, was in einer Klasse überhaupt deklariert werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357366</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 02 Oct 2013 15:49:53 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 15:15:41 GMT]]></title><description><![CDATA[<p>Sone, ich finds ja großartig, dass du dich hier einbringen willst, aber irgendwie scheinst du nicht alles mitzulesen. <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357373</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Wed, 02 Oct 2013 15:15:41 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 15:54:44 GMT]]></title><description><![CDATA[<p>Lymogry schrieb:</p>
<blockquote>
<p>irgendwie scheinst du nicht alles mitzulesen</p>
</blockquote>
<p>Eigentlich war dein Kommentar im Code völlig sinnlos, ich musste also raten, was du meinst.<br />
Also: Was meintest du mit deinem Kommentar? Oder was genau war an meinem Post nicht dem Kontext entsprechend?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357378</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 02 Oct 2013 15:54:44 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 15:58:13 GMT]]></title><description><![CDATA[<p>Ist ja süß, jetzt ist er eingeschnappt <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="😉"
    /></p>
<p>Lass es gut sein oder philosophier noch etwas. Tipp: Was der Zähler ist, das hast du nach 3 Seiten noch nicht begriffen. Was soll ich dann noch mit deinen sogenannten Tipps oder dem abstrakten Beispiel? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a><br />
DANKE! Du hast mir viel geholfen. <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>EDIT: nach dem fünftmaligen Editieren ist er wohl nicht mehr eingeschnappt. <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="🙂"
    /> Oder doch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357380</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Wed, 02 Oct 2013 15:58:13 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 16:00:30 GMT]]></title><description><![CDATA[<blockquote>
<p>Oder doch?</p>
</blockquote>
<p>Nein, ich kann mich beherrschen.</p>
<blockquote>
<p>Was der Zähler ist, das hast du nach 3 Seiten noch nicht begriffen.</p>
</blockquote>
<p><em>Bitte?</em> Natürlich habe ich das!? Ich schrieb &quot;Welcher Zähler&quot; als Anspielung, da du den Zähler ja offensichtlich rausschmeißen wirst, wenn der Destruktor wieder leer ist. Woran erkennst du das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357381</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 02 Oct 2013 16:00:30 GMT</pubDate></item><item><title><![CDATA[Reply to Class mit Feldfunktion on Wed, 02 Oct 2013 16:07:32 GMT]]></title><description><![CDATA[<p>.. so langsam interessiert mich dein Alter. <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="😃"
    /> Frag lieber nicht: wieso!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357383</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Wed, 02 Oct 2013 16:07:32 GMT</pubDate></item></channel></rss>