<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Frage zur Funktion List.push_back()]]></title><description><![CDATA[<p>Hallo,</p>
<p>Wie der Titel schon sagt, ist mir einiges Unklar beim arbeiten mit Listen, Deques usw.</p>
<p>Hab hier mal schnell ein kleines Beispiel geschrieben, um meine Fragen zu verdeutlichen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;

using namespace std;

class var{
private:
	int *a;

public:
	var(int b){
		a = new int(b);
	};

	~var(){
		delete a;
	};

	var(var *b){
	*a = *b-&gt;a;
	};

	void set_var(int b){
		*a = b;
	};

	int get_var(){
		return *a;
	};
};

int main(){

	list&lt;var&gt; *varlist = new list&lt;var&gt;;

	var a(12);

	var* b = new var(13);

	varlist-&gt;push_back(a);
	varlist-&gt;push_back(*b);

	delete varlist;
	delete b;

	return 0;
};
</code></pre>
<p>Also:</p>
<p>Wie genau arbeitet die Funktion push_back? Erstellt es eine Kopie des Objektes oder speichert es nur eine Referenz?<br />
Hatte das Problem, dass wenn ich (siehe oben) *b in die Liste einfügte, und danach b löschte, der Eintrag in der List ungültig wurde, und somit einen Programmabsturzt verursachte. Wenn ich es jedoch nur mit push_back(*b) einfügte, und danach nicht &quot;delete b&quot; sondern gleich &quot;b = new int&quot; mache, kann ich nacher auf die Objekte zugreifen.</p>
<p>Es würde mir sehr viel Helfen zu wissen, wie genau die Funktion push_back() arbeitet, und worauf man Achten muss wenn man mit dieser Funktion mit dynamisch erzeugten Objecten arbeitet.</p>
<p>Besten Dank im vor raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242205/frage-zur-funktion-list-push_back</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 22:23:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242205.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Jun 2009 00:11:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Mon, 01 Jun 2009 00:11:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Wie der Titel schon sagt, ist mir einiges Unklar beim arbeiten mit Listen, Deques usw.</p>
<p>Hab hier mal schnell ein kleines Beispiel geschrieben, um meine Fragen zu verdeutlichen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;

using namespace std;

class var{
private:
	int *a;

public:
	var(int b){
		a = new int(b);
	};

	~var(){
		delete a;
	};

	var(var *b){
	*a = *b-&gt;a;
	};

	void set_var(int b){
		*a = b;
	};

	int get_var(){
		return *a;
	};
};

int main(){

	list&lt;var&gt; *varlist = new list&lt;var&gt;;

	var a(12);

	var* b = new var(13);

	varlist-&gt;push_back(a);
	varlist-&gt;push_back(*b);

	delete varlist;
	delete b;

	return 0;
};
</code></pre>
<p>Also:</p>
<p>Wie genau arbeitet die Funktion push_back? Erstellt es eine Kopie des Objektes oder speichert es nur eine Referenz?<br />
Hatte das Problem, dass wenn ich (siehe oben) *b in die Liste einfügte, und danach b löschte, der Eintrag in der List ungültig wurde, und somit einen Programmabsturzt verursachte. Wenn ich es jedoch nur mit push_back(*b) einfügte, und danach nicht &quot;delete b&quot; sondern gleich &quot;b = new int&quot; mache, kann ich nacher auf die Objekte zugreifen.</p>
<p>Es würde mir sehr viel Helfen zu wissen, wie genau die Funktion push_back() arbeitet, und worauf man Achten muss wenn man mit dieser Funktion mit dynamisch erzeugten Objecten arbeitet.</p>
<p>Besten Dank im vor raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1718879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1718879</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Mon, 01 Jun 2009 00:11:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Mon, 01 Jun 2009 00:42:06 GMT]]></title><description><![CDATA[<p><code>push_back</code> speichert eine Kopie im Vektor ab. Das Problem liegt hier nicht bei der <code>push_back</code> Methode, sondern bei deiner Klasse <code>var</code> .</p>
<p>Überleg mal was passiert, wenn ein Objekt vom Typ <code>var</code> kopiert wird. Es wird der Zeiger <code>a</code> kopiert. Dadurch hast du nach der Kopie zwei Objekte, welche einen Zeiger auf das gleiche Objekt besitzen. Wenn nun eines der zwei Objekte gelöscht wird, wird der Destruktor von <code>var</code> aufgerufen. Dieser löscht das Objekt, auf welches der Zeiger <code>a</code> zeigt. Du hast aber jetzt immer noch ein gültiges Objekt, welches einen Zeiger besitzt, der ins Nirvana zeigt. Über kurz oder lang kommt es hier zu einem Fehler, bzw. führt es zu undefiniertem Verhalten.</p>
<p>Was du hier tun musst, sind &quot;Die Grossen Drei&quot; zu implementieren:<br />
<a href="http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)" rel="nofollow">http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)</a></p>
<p>Damit kannst du dafür sorgen, dass nicht nur eine flache Kopie stattfindet, sondern eine tiefe Kopie. Also nicht der Zeiger <code>a</code> kopiert wird, sondern das worauf er zeigt.</p>
<p>Grüssli</p>
<p>PS: Wieso legst du eigentlich das <code>list&lt;var&gt;</code> Objekt auf dem Freestore ab?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1718883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1718883</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 01 Jun 2009 00:42:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Mon, 01 Jun 2009 00:45:11 GMT]]></title><description><![CDATA[<p>Das ist nur ein extrem vereinfachter Ausschnitt von einem Programm an dem ich grad arbeite. Wollte hier keine 600 Zeilen Code posten.</p>
<p>Werd mir das mit &quot;Die großen Drei&quot; gleich mal ansehen.</p>
<p>Danke schonmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1718884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1718884</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Mon, 01 Jun 2009 00:45:11 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Mon, 01 Jun 2009 01:20:13 GMT]]></title><description><![CDATA[<p>das hier bleibt allerdings:<br />
<code>list&lt;var&gt; *varlist = new list&lt;var&gt;;</code><br />
wieso nicht auf den stack packen?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1718890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1718890</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 01 Jun 2009 01:20:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 12:51:50 GMT]]></title><description><![CDATA[<p>Entschuldigung für die Verspätete Antwort, aber hatte erst jetzt Zeit mich darum zu kümmern.</p>
<p>Warum ich das ned auf den Stack packe? Ich habe mal wo gelesen, dass der Stack auch ned unbegrenzt Speicherplatz bietet. Und da in diese Liste etwa 10MB an Daten reingeladen werden, aus XML Dateien, dacht ich mir speicher ich die Liste im Heap. Bin noch am Lernen und Vertiefen von C++.</p>
<p>Hab &quot;Die Grossen Drei&quot; jetz eingebaut, bevor ich euch jedoch den Code vorlege noch eine Frage.</p>
<p>Wenn ich eine Klasse habe z.B:</p>
<pre><code class="language-cpp">class A{
private:
int a;
...
};
</code></pre>
<p>Wenn ich jetz &quot;A *first = new A;&quot; schreibe, wird dann die Variable in A, auf dem Heap oder dem Stack abgelegt? Wenn die auf dem Heap abgelegt wird dann kann ich mir doch eigentlich den mehr Aufwand mit Zeigern sparen.</p>
<p>So, hier mal der überarbeitete Ausschnitt aus der Original Klasse:</p>
<pre><code class="language-cpp">class Item{ 
private:
	//itemID,locationID,typeID,quantity,flag,singleton
	string *itemID;
	string *locationID;
	string *typeID;
	string *squantity;
	string *flag;
	string *singleton;
	string *containerID;
	bool   *contains;

	string *itemName;
	string *locationName;
	long long *quantity;
	long long *soll;
	long long *difference;
	string *groupID;
	string *group;
	string *categoryID;
	string *category;

	bool *adjusted;
public:
	Item(){
				itemID = new string(&quot;0&quot;);
				locationID = new string(&quot;0&quot;);
				typeID = new string(&quot;0&quot;);
				squantity = new string(&quot;0&quot;);
				flag = new string(&quot;0&quot;);
				singleton = new string(&quot;0&quot;);
				containerID = new string(&quot;0&quot;);
				contains = new bool(false);

				itemName = new string(&quot;0&quot;);
				locationName = new string(&quot;0&quot;);
				quantity = new long long (0);
				soll = new long long(0);
				difference = new long long(0);
				groupID = new string(&quot;0&quot;);
				group = new string(&quot;0&quot;);
				categoryID = new string(&quot;0&quot;);
				adjusted = new bool(false);
	};

	Item(string *iID,
		 string *lID,
		 string *tID,
		 string *qua,
		 string *fla,
		 string *sin,
		 string *cID,
		 bool	*con){
				itemID = new string(*iID);
				locationID = new string(*lID);
				typeID = new string(*tID);
				squantity = new string (*qua);
				flag = new string(*fla);
				singleton = new string (*sin);
				containerID = new string (*cID);
				contains = new bool(*con);

				itemName = new string(&quot;0&quot;);
				locationName = new string (&quot;0&quot;);
				quantity = new long long(0);
				soll = new long long(0);
				difference = new long long(0);
				groupID = new string(&quot;0&quot;);
				group = new string(&quot;0&quot;);
				categoryID = new string(&quot;0&quot;);
				category = new string(&quot;0&quot;);
				adjusted = new bool(false);

	};

	Item(Item* base){
				*itemID = *base-&gt;itemID;
				*typeID = *base-&gt;typeID;
				*squantity = *base-&gt;squantity;
				*flag = *base-&gt;flag;
				*singleton = *base-&gt;singleton;
				*containerID = *base-&gt;containerID;
				*contains = *base-&gt;contains;

				*itemName = *base-&gt;itemName;
				*locationName = *base-&gt;locationName;
				*quantity = *base-&gt;quantity;
				*soll = *base-&gt;soll;
				*difference = *base-&gt;difference;
				*groupID = *base-&gt;groupID;
				*group = *base-&gt;group;
				*categoryID = *base-&gt;categoryID;
				*category = *base-&gt;category;
				*adjusted = *base-&gt;adjusted;

	};

	Item &amp; operator = (const Item *other){

		string * new_itemID = new string(*other-&gt;itemID);
		string * new_typeID = new string(*other-&gt;typeID);
		string * new_squantity = new string(*other-&gt;squantity);
		string * new_flag = new string(*other-&gt;flag);
		string * new_singleton = new string(*other-&gt;singleton);
		string * new_containerID = new string(*other-&gt;containerID);
		bool * new_contains = new bool(*other-&gt;contains);

		string * new_itemName = new string(*other-&gt;itemName);
		string * new_locationName = new string(*other-&gt;locationName);
		long long * new_quantity = new long long(*other-&gt;quantity);
		long long * new_soll = new long long(*other-&gt;soll);
		long long * new_difference = new long long(*other-&gt;difference);
		string * new_groupID = new string(*other-&gt;groupID);
		string * new_group = new string(*other-&gt;group);
		string * new_categoryID = new string(*other-&gt;categoryID);
		string * new_category = new string(*other-&gt;category);
		bool * new_adjusted = new bool(*other-&gt;adjusted);

		delete itemID;
		delete typeID;
		delete squantity;
		delete flag;
		delete singleton;
		delete containerID;
		delete itemName;
		delete locationName;
		delete group;
		delete category;
		delete categoryID;
		delete locationID;
		delete contains, adjusted;
		delete quantity, soll, difference;
		delete groupID;

		itemID = new_itemID;
		typeID = new_typeID;
		squantity = new_squantity;
		flag = new_flag;
		singleton = new_singleton;
		containerID = new_containerID;
		contains = new_contains;
		itemName = new_itemName;
		locationName = new_locationName;
		quantity = new_quantity;
		soll = new_soll;
		difference = new_difference;
		groupID = new_groupID;
		group = new_group;
		categoryID = new_categoryID;
		category = new_category;
		adjusted = new_adjusted;

	};

	~Item(){
		delete itemID;
		delete typeID;
		delete squantity;
		delete flag;
		delete singleton;
		delete containerID;
		delete itemName;
		delete locationName;
		delete group;
		delete category;
		delete categoryID;
		delete locationID;
		delete contains, adjusted;
		delete quantity, soll, difference;
		delete groupID;
	};

....
</code></pre>
<p>Achja, wenn das so stimmt wie ich das eingebaut habe, dann liegt mein Problem wohl nicht daran sondern in einem anderen Teil des Programms <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/1719607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719607</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Tue, 02 Jun 2009 12:51:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 13:01:23 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Das sieht nicht wirklich gesund aus..</p>
<p>Warum macht du alle Parameter dynamisch? - String braucht das wirklich nicht. Das sind hier ja nur einzelne Bestandteile. Wenn es nötig sein sollte dynamischen Speicher zu benutzen wegen der Grösse, dann mach das gleich mit den Item's und nicht den einzelnen Parameter.. <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="🙄"
    /></p>
<blockquote>
<p>Wenn ich jetz &quot;A *first = new A;&quot; schreibe, wird dann die Variable in A, auf dem Heap oder dem Stack abgelegt? Wenn die auf dem Heap abgelegt wird dann kann ich mir doch eigentlich den mehr Aufwand mit Zeigern sparen.</p>
</blockquote>
<p>Hier wird durch new ein Objekt vom Typ A auf dynamisch angefordert und der Zeiger (welcher aber automatisch ( Stack ) ist).</p>
<p>Dann solltest du dir mal das Copy/Swap Idiom anschauen. Damit kannst du dir viel Arbeit sparen und deine Klasse sicherer machen.</p>
<p>EDIT:<br />
Gerade noch aufgefallen:<br />
Das hier macht nicht das, was du denkst:</p>
<pre><code class="language-cpp">delete quantity, soll, difference;
</code></pre>
<p>Da wir lediglich quantity gelöscht.</p>
<p>Und die Initialisierungsliste solltest du dir auch mal anschauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719614</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 02 Jun 2009 13:01:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 13:06:35 GMT]]></title><description><![CDATA[<p><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="😃"
    /> Dacht mir schon dass es so schlimm ausieht wie es ist.</p>
<p>Werds nochmal überarbeiten und mir das mit dem Copy/Swap Idiom ansehen.</p>
<p>Danke 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>
<p>#Edit</p>
<p>Oh, ok, hab ich ned gewusst, gleich ändern.</p>
<p>Was meinst du das ich mir bei der Initialisierungsliste nochmal ansehen soll?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719622</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Tue, 02 Jun 2009 13:06:35 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 13:05:20 GMT]]></title><description><![CDATA[<p>Neo Gandar schrieb:</p>
<blockquote>
<p>Warum ich das ned auf den Stack packe? Ich habe mal wo gelesen, dass der Stack auch ned unbegrenzt Speicherplatz bietet. Und da in diese Liste etwa 10MB an Daten reingeladen werden, aus XML Dateien, dacht ich mir speicher ich die Liste im Heap. Bin noch am Lernen und Vertiefen von C++.</p>
</blockquote>
<p>Deshalb habe ich nachgefragt <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>
<pre><code class="language-cpp">#include &lt;list&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;algorithm&gt;

int main()
{
  std::list&lt;int&gt; first;
  std::list&lt;int&gt; second;

  // beide leer, ok, füllen wir eine:
  std::fill_n(std::back_inserter(first), 10000, 4);

  // Geben wir die Anzahl an Elemente aus:
  std::cout &lt;&lt; &quot;first count:  &quot; &lt;&lt; first.size() &lt;&lt; std::endl;
  std::cout &lt;&lt; &quot;second count: &quot; &lt;&lt; second.size() &lt;&lt; std::endl;

  // Grosser Unterschied ...
  // Nun betrachten wir mal die Bytegrösse der beiden Objekte auf dem Stack:
  std::cout &lt;&lt; &quot;first Bytes:  &quot; &lt;&lt; sizeof(first) &lt;&lt; std::endl;
  std::cout &lt;&lt; &quot;second Bytes: &quot; &lt;&lt; sizeof(second) &lt;&lt; std::endl;

  // Wird gleichviel sein ;)
}
</code></pre>
<p>Ein Objekt kann seine Grösse zur Laufzeit nicht verändern, erst recht nicht auf dem Stack. Es können nur neue Objekte angelegt werden. Eine <code>std::list</code> legt auch neue Objekte an, und zwar über einen Allocator. Denn kann man selber angeben oder es wird der Defaultallocator verwendet, <code>std::allocator</code> . Dieser allokiert die neuen Elemente per <code>new</code> auf dem Heap.</p>
<p>Neo Gandar schrieb:</p>
<blockquote>
<p>Wenn ich jetz &quot;A *first = new A;&quot; schreibe, wird dann die Variable in A, auf dem Heap oder dem Stack abgelegt? Wenn die auf dem Heap abgelegt wird dann kann ich mir doch eigentlich den mehr Aufwand mit Zeigern sparen.</p>
</blockquote>
<p>Ja, die Variable kommt auch auf den Heap. Und ja, du kannst dir die Zeiger sparen, unbedingt! <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><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719623</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 02 Jun 2009 13:05:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 13:46:53 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> triffts ziemlich gut...</p>
<p>Warum überhaupt so viele Variablen? Würde man das Ganze ein wenig sinnvoll kapseln, käme man nur noch auf vereinzelte Member pro Klasse. Also überlege dir, welche Variablen logisch zusammengefasst werden können, und lagere diese aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719663</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 02 Jun 2009 13:46:53 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 14:32:44 GMT]]></title><description><![CDATA[<blockquote>
<p>Ja, die Variable kommt auch auf den Heap. Und ja, du kannst dir die Zeiger sparen, unbedingt!</p>
</blockquote>
<p>Also das, worauf der Zeiger zeigt befindet sich auf dem &quot;Heap&quot;, aber der Zeiger selbst befindet sich auf dem &quot;Stack&quot;. (ich schreibe das in Anführgungszeichen, weil ja eher dynamisch und automatisch gemeint ist, aber das mal ausser Acht gelassen.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719718</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 02 Jun 2009 14:32:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 15:12:23 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<blockquote>
<p>Ja, die Variable kommt auch auf den Heap. Und ja, du kannst dir die Zeiger sparen, unbedingt!</p>
</blockquote>
<p>Also das, worauf der Zeiger zeigt befindet sich auf dem &quot;Heap&quot;, aber der Zeiger selbst befindet sich auf dem &quot;Stack&quot;. (ich schreibe das in Anführgungszeichen, weil ja eher dynamisch und automatisch gemeint ist, aber das mal ausser Acht gelassen.)</p>
</blockquote>
<p>Er redet aber nicht vom Zeiger, sondern von der Variable in A. Keine Ahnung, wie du auf den Zeiger kommst. Vielleicht weil du so viele Zeiger gesehen hast? <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719753</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 02 Jun 2009 15:12:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 15:27:52 GMT]]></title><description><![CDATA[<p>Ihr habt beide Unrecht. <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>
<pre><code class="language-cpp">A *first = new A;
</code></pre>
<p><code>A</code> ist hier keine Variable und kein Zeiger, sondern ein Typ. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719765</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 02 Jun 2009 15:27:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 15:43:24 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>,<br />
Dann sage mir, wie Neo Gandar es richtig hätte formulieren sollen. Womöglich:<br />
&quot;Wohin kommt die Variable im Objekt vom Typ A?&quot;</p>
<p>Dann bist du aber ein Erbsenzähler! :p</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719777</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 02 Jun 2009 15:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 16:44:08 GMT]]></title><description><![CDATA[<p>oook <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="🙂"
    /> hab ich das also richtig verstanden:</p>
<p>bei</p>
<pre><code class="language-cpp">class A{
private:
int a;
...
}; 	

A *first = new A;
</code></pre>
<p>*first befindet sich auf dem Stack, und zeigt auf das Object A, das sich im Heap befindet. Und somit ist die Variable a auch im Heap.</p>
<p>wenn ich jetz eine Liste erstelle</p>
<pre><code class="language-cpp">list&lt;A&gt; *Liste = new list&lt;A&gt;;
</code></pre>
<p>Dann befindet sich *Liste auf dem Stack, und zeigt auf die list im Heap.<br />
Dadurch befinden sich, auch alle anderen Objekte und deren Zeiger, die in die Liste eingefügt werden im Heap.</p>
<p>Also ist das Einzige was dabei im Stack abgelegt wird *Liste, der rest kommt in den Heap. Oder?</p>
<p>Weil wär nicht so passend wenn die Zeiger für 100.000 Objekte, die in der Liste sind, auf dem Stack gespeichert werden <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/1719823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719823</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Tue, 02 Jun 2009 16:44:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 16:49:42 GMT]]></title><description><![CDATA[<blockquote>
<p>Dadurch befinden sich, auch alle anderen Objekte und deren Zeiger, die in die Liste eingefügt werden im Heap.</p>
</blockquote>
<p>Gespeichert werden die Objekte in std::list und den meisten anderen Containern ebenfalls auf dynamisch (heap). Das ist ja der Sinn davon. Eine dynamische Menge an Objekten zu verwalten. Wenn du da dann mit eigenem new Zeugs kommst ist die ganze Übung umsonst und hättest alles von vorne selbst machen können.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a> &amp; Dravere:<br />
Ihr seit doch beide Kindsköpfe. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719825</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 02 Jun 2009 16:49:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 17:21:18 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/11958">@Neo</a> Gandar,<br />
Alles korrekt bis auf den Teil, welcher drakon zitiert hat. Die Schlussfolgerung stimmt da nicht. Die Elemente liegen dort nicht auf dem Heap, weil du die Liste auf dem Heap gesetzt hast. Die Elemente in einer Liste haben nichts gemeinsames mit Membervariablen.</p>
<p>Schau auch ruhig nochmals meinen vorherigen Beitrag an und probier es aus:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1719623.html#1719623" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-p-is-1719623.html#1719623</a></p>
<p>Oder probier als Übung mal eine Double-Linked-List zu implementieren <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><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>,<br />
So bleibt man jung <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719852</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 02 Jun 2009 17:21:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Tue, 02 Jun 2009 18:53:40 GMT]]></title><description><![CDATA[<p>Ok, glaub jetz hab ich verstanden <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="🙂"
    /> Hab dein Beispiel auf mit deque probiert <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>Muss jetz aber einen großteil des Programmes umschreiben, ich meld mich also wieder wenn das erledigt ist. Vermute aber, das ich irgendwo schlampig gerarbeitet hab, und dadurch der Fehler verursacht wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1719927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1719927</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Tue, 02 Jun 2009 18:53:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Sat, 06 Jun 2009 06:42:16 GMT]]></title><description><![CDATA[<p>So, hab mich entschieden das Programm als Grundlage für ein neues zu nehmen da ich viel zu viele Fehler beim schreiben des Codes gemacht habe.</p>
<p>Hab die Klasse jetz aufgeteilt, und die erste Klasse fertig. Die Zweite sieht dann vom Aufbau her gleich aus.</p>
<p>Hier die data.h:</p>
<pre><code class="language-cpp">#ifndef _data_h
#define _data_h

#include &lt;string&gt;

using namespace std;

//Daten, die vom Programm erzeugt/ergänzt werden

class Data{

private:
	string itemName;
	string locationName;
	long long quantity;
	long long soll;
	long long difference;
	string groupID;
	string group;
	string categoryID;
	string category;

	bool adjusted;

public:
	Data();
	Data(const Data &amp;base);	

	Data &amp; operator = (Data const &amp;base){
		string temp(base.itemName);
		temp.swap(this-&gt;itemName);

		temp = base.locationName;
		temp.swap(this-&gt;locationName);

		temp = base.groupID;
		temp.swap(this-&gt;groupID);

		temp = base.group;
		temp.swap(this-&gt;group);

		temp = base.categoryID;
		temp.swap(this-&gt;categoryID);

		temp = base.category;
		temp.swap(this-&gt;category);

		this-&gt;quantity = base.quantity;
		this-&gt;soll = base.soll;
		this-&gt;difference = base.difference;

		return *this;
	};
//Weitere Methoden
};
</code></pre>
<p>Und hier die data.cpp:</p>
<pre><code class="language-cpp">#ifndef _data_cpp
#define _data_cpp

#include &lt;string&gt;

#include &quot;data.h&quot;

using namespace std;

/* Variablen der Klasse Data:
    string itemName;
	string locationName;
	long long quantity;
	long long soll;
	long long difference;
	string groupID;
	string group;
	string categoryID;
	string category;

	bool adjusted;

*/

Data::Data(){
	itemName = &quot;&quot;;
	locationName = &quot;&quot;;
	quantity = 0;
	soll = 0;
	difference = 0;
	groupID = &quot;&quot;;
	group = &quot;&quot;;
	categoryID = &quot;&quot;;
	category = &quot;&quot;;
	adjusted = false;
};

Data::Data(const Data &amp;base) 
		: itemName(base.itemName),
		locationName(base.locationName),
		quantity(base.quantity),
		soll(base.soll),
		difference(base.difference),
		groupID(base.groupID),
		group(base.group),
		categoryID(base.categoryID),
		category(base.category),
		adjusted(base.adjusted) {};

//Weitere Methoden

#endif
</code></pre>
<p>Hab versucht eure Vorschläge/Verbesserungen umzusetzten und hoffe dass das so jetzt auch passt <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>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722098</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Sat, 06 Jun 2009 06:42:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Sat, 06 Jun 2009 11:08:18 GMT]]></title><description><![CDATA[<p>Warum schiebst du bei deinem <code>operator =</code> alles zuerst in einen temporären String?<br />
Du kannst alles direkt swappen und dann machst du einfach eine Kopie des gesamten Objektes (unter Benutzung des copy-ctor).<br />
Und rufst dann swap auf.</p>
<p>Und warum benutzt du im default ctor die Initialisierungsliste nicht, wo du sie doch im copy-ctor benutzt?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722185</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 06 Jun 2009 11:08:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Sat, 06 Jun 2009 11:09:44 GMT]]></title><description><![CDATA[<p>Naja - ich find vieles nich so dolle - nen bissl was davon zähl ich hier mal auf:</p>
<pre><code class="language-cpp">#ifndef _data_h
#define _data_h
</code></pre>
<p>Makros werden eigtl groß geschrieben und (dann) am Anfang auch keine Unterstruiche enthalten - außerdem fehlt hier das #endif...</p>
<p><code>using namespace std;</code><br />
Sollte man nie im Header stehen haben!<br />
In der Source-Date (*.cpp) ist es aber in Ordnung - lediglich noch Geschmackssache ^^</p>
<pre><code class="language-cpp">Data &amp; operator = (Data const &amp;base){
		string temp(base.itemName);
		temp.swap(this-&gt;itemName);
</code></pre>
<p>base ist nen komischer name : D<br />
Außerdem implementiert man den op= eigtl durch Copy&amp;Swap:</p>
<pre><code class="language-cpp">Data&amp; operator= (Data const &amp;rhs)
{
 Data to_swap(rhs);
 swap(to_swap);
 return *this;
}
</code></pre>
<p>und wenn du es schon unbedingt so lassen möchtest, dann lass bitte das this-&gt; weg - das führt ja zu Augenkrebs <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=";D"
      alt="😉"
    /></p>
<pre><code class="language-cpp">string itemName;
	string locationName;
	long long quantity;
	long long soll;
	long long difference;
	string groupID;
	string group;
	string categoryID;
	string category;

	bool adjusted;
</code></pre>
<p>So viele Member-Variablen sind meist ein Indiz dafür, dass man die Klasse noch weiter aufsplitten sollte....<br />
Außerdem: Warum IDs als string speicher?<br />
Und warum alles englisch außer &quot;soll&quot;? : D</p>
<pre><code class="language-cpp">#ifndef _data_cpp
#define _data_cpp
</code></pre>
<p>Ähmm.. Nein? Die Source-Datei braucht keine Include-Guards... Hier gabs vor kurzem auch nen Thread, wo wir ein wenig erklärt haben, wie das mit den Source-Dateien ist (in Kurzform: werden von der IDE automatisch kompiliert - genau einmal und die *.h wird immer nur included, wenn iwas benötigt wird - und genau deshalb wird sie nur einmal geparst und braucht deshalb keine Include-Guards... Die würden btw auch nichts bringen, wenn du die *.cpp iwo includen würdest ^^</p>
<pre><code class="language-cpp">/* Variablen der Klasse Data:
    string itemName;
	string locationName;
	long long quantity;
	long long soll;
	long long difference;
	string groupID;
	string group;
	string categoryID;
	string category;

	bool adjusted;
*/
</code></pre>
<p>Nette Idee - aber eigtl überflüssig und vor allem umständlich <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>
<pre><code class="language-cpp">Data::Data(){
	itemName = &quot;&quot;;
	locationName = &quot;&quot;;
	quantity = 0;
	soll = 0;
	difference = 0;
	groupID = &quot;&quot;;
	group = &quot;&quot;;
	categoryID = &quot;&quot;;
	category = &quot;&quot;;
	adjusted = false;
};
</code></pre>
<p>-&gt; Initialisierungsliste<br />
Bei mir würde das so aussehen:</p>
<pre><code class="language-cpp">Data::Data()
:  quantity(0), soll(0), difference(0), adjusted(false)
{}
</code></pre>
<p>Japp, das reicht - mehr brauchst du nicht hinzuschreiben...<br />
Der Standard-CTor von <code>std::string</code> liefert ja (logischerweise) nen leeren String... ^^</p>
<pre><code class="language-cpp">Data::Data(const Data &amp;base) //wieder nen komischer Name ^^
		: itemName(base.itemName),
		locationName(base.locationName),
		/*...*/
		category(base.category),
		adjusted(base.adjusted) //ich würde nur ein Tab einrücken ^^
{}; //';' ist überflüssig
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722187</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 06 Jun 2009 11:09:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Sat, 06 Jun 2009 11:46:00 GMT]]></title><description><![CDATA[<blockquote>
<p>außerdem fehlt hier das #endif...</p>
</blockquote>
<p>Habs nur nicht mitkopert, da ich die ganzen Methoden nicht mitkopieren wollte ^^ habs übersehen dass es hier im Post fehlt.</p>
<blockquote>
<p>Außerdem: Warum IDs als string speicher?</p>
</blockquote>
<p>Weil die IDs sowieso nur als Vergleich zwischen verschiedenen Objekten dienen und ich diese aus ner Datei als string einlese, und mir die Typenumwandlung sparen wollte ^^.</p>
<blockquote>
<p>Und warum alles englisch außer &quot;soll&quot;? : D</p>
</blockquote>
<p>Weil mir, als ich damals das erste mal diese Klasse erstellt habe, der englische Begriff für &quot;Sollwert&quot; ned eingefallen ist ^^ und sieht ja nacher im Programm eh keiner <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>
<blockquote>
<p>So viele Member-Variablen sind meist ein Indiz dafür, dass man die Klasse noch weiter aufsplitten sollte....</p>
</blockquote>
<p>Man könnte die ganzen Variablen auch mit ner struc lösen, jedoch nutze ich den vorteil von Klassen, um über Polymorphie über die gleiche Methode nen string in eine long long variable umzuwandeln usw.</p>
<p>Warum ich das weiter aufteilen soll geht mir nicht ein, da die Methoden ja wirklich nur max. 4 Zeilen lang sind, und sich der Aufwand durch mehrere Klassen ja nur erhöht.</p>
<blockquote>
<p>Warum schiebst du bei deinem operator = alles zuerst in einen temporären String?<br />
Du kannst alles direkt swappen und dann machst du einfach eine Kopie des gesamten Objektes (unter Benutzung des copy-ctor).<br />
Und rufst dann swap auf.</p>
</blockquote>
<p>Hab mir das aus dem Link auf der ersten Seite abgeschaut, dass das auch mit dem ganzen Objekt geht wusste ich ned.</p>
<p>Zum using Namespace std; :<br />
Das ganze Prog ist eigentlich in dem Namespace, und da ich nicht einbinde das nen anderen Namensraum hat, geht es doch so schneller oder? Oder lauf ich dadurch irgendwie in Gefahr?</p>
<p>Hab die Klasse mal geändert:</p>
<p>data.h</p>
<pre><code class="language-cpp">#ifndef DATA_H
#define DATA_H

#include &lt;string&gt;

using namespace std;

//Daten, die vom Programm erzeugt/ergänzt werden

class Data{

private:
	string itemName;
	string locationName;
	long long quantity;
	long long soll;
	long long difference;
	string groupID;
	string group;
	string categoryID;
	string category;

	bool adjusted;

public:
	Data();
	Data(const Data &amp;rhs);	

	Data&amp; operator= (Data const &amp;rhs){
		Data to_swap(rhs);
		swap(to_swap, *this);
		return *this;
	} 
        //jede menge Methoden
};
#endif
</code></pre>
<p>data.cpp:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &quot;data.h&quot;

using namespace std;

Data::Data()
:	quantity(0),soll(0),difference(0),adjusted(false)
{}

Data::Data(const Data &amp;rhs) 
	: itemName(rhs.itemName),
	locationName(rhs.locationName),
	quantity(rhs.quantity),
	soll(rhs.soll),
	difference(rhs.difference),
	groupID(rhs.groupID),
	group(rhs.group),
	categoryID(rhs.categoryID),
	category(rhs.category),
	adjusted(rhs.adjusted) {}

//Jede Menge Methoden
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1722211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722211</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Sat, 06 Jun 2009 11:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Sat, 06 Jun 2009 12:01:29 GMT]]></title><description><![CDATA[<p>Dein <code>swap</code> könntest du effizienter gestalten, indem du die jeweiligen Member einzeln tauschst. <code>std::string</code> zum Beispiel hat ein eigenes <code>swap()</code> implementiert. Das könnte zum Beispiel so aussehen:</p>
<pre><code class="language-cpp">void Data::swap(Data&amp; other)
{
    std::swap(itemName, other.itemName);
    std::swap(quantity, other.quantity);
    // ...
}
</code></pre>
<p>Zudem kannst du noch ein globales <code>swap()</code> für deine Klasse anbieten. Ist zwar etwas Schreibaufwand, aber es ist gut, sich solche Dinge anzugewöhnen, auch später wegen Exceptionsicherheit. Dein Zuweisungsoperator könnte dann so aussehen:</p>
<pre><code class="language-cpp">Data&amp; operator= (const Data&amp; other)
{
    Data(other).swap(*this);
    return *this;
}
</code></pre>
<p>Brauchst du eigentlich <code>long long</code> ? Dieser Typ ist nicht im C++-Standard enthalten. In den meisten Fällen reichen eigentlich <code>int</code> bzw. <code>long</code> . Und IDs würde ich auch eher als Zahlen speichern...</p>
<p>Zum <code>using namespace std;</code> - ich würde mir generell abgewöhnen, <code>using namespace</code> in Headerdateien zu verwenden. Dadurch wird der gesamte Namensraum in allen inkludierenden Dateien ausgeschüttet, was nicht immer erwünscht ist. Die paar <code>std::</code> sollten wohl noch drin liegen, soviel Aufwand ist das nicht. Ich gebe bei mir den Namensraum eigentlich immer an, auch in lokalen Funktionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722221</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 06 Jun 2009 12:01:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Sat, 06 Jun 2009 12:09:33 GMT]]></title><description><![CDATA[<p>Ok, danke für die Tipps, werd versuchen sie umzusetzten und mir das mit dem namespace abgewöhnen <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>Warum long long. Es kommt vor, dass die Zahlen bis zu einigen Milliarden groß sind (größte was ich gefunden hab waren ~150 Mrd), und das ist zuviel für ne normale long, da diese dann den Bereich überschreitet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722229</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Sat, 06 Jun 2009 12:09:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Sat, 06 Jun 2009 12:13:04 GMT]]></title><description><![CDATA[<p>Neo Gandar schrieb:</p>
<blockquote>
<p>Warum long long. Es kommt vor, dass die Zahlen bis zu einigen Milliarden groß sind (größte was ich gefunden hab waren ~150 Mrd), und das ist zuviel für ne normale long, da diese dann den Bereich überschreitet.</p>
</blockquote>
<p>Ah, dann ist es okay. Ich hatte nur irgendwie das Gefühl, du hättest mal vorsorglich grosse Typen genommen. <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>Du solltest dir einfach im Hinterkopf behalten, dass mit <code>long long</code> nicht mehr ganz standardkonform bist, solltest du zum Beispiel mal eine Portierung oder Ähnliches vorsehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722231</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 06 Jun 2009 12:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Sat, 06 Jun 2009 12:20:08 GMT]]></title><description><![CDATA[<p>Gibt es Standartkonforme Lösungen dafür? Da ich das Programm sowieso grad neu schreibe (und vorallem Strukturiere <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="🙂"
    /> ) könnte ich es dann ja auch gleich ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722236</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Sat, 06 Jun 2009 12:20:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Funktion List.push_back() on Sat, 06 Jun 2009 12:24:02 GMT]]></title><description><![CDATA[<p>Da müsstest du wohl auf externe Bibliotheken zurückgreifen. Solange es nur zur Übung ist oder du dich nicht gross um Portabilität kümmerst, würde ich sagen, lohnt sich der Aufwand einer Umstellung nicht. Eine Bibliothek impliziert nämlich das Suchen, Downloaden, Installieren, Doku-Lesen und Linken. <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/1722241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722241</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 06 Jun 2009 12:24:02 GMT</pubDate></item></channel></rss>