<?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[is mein code so in ordnung?]]></title><description><![CDATA[<p>hi,<br />
bin anfänger, hab code geschrieben, möchte wissen was es alles an dem auszusetzen gibt und was ihr anders gemacht hättet. unter dem code stehen noch ein paar konkrete fragen, hier ist mal der quelltext:</p>
<p>Person.h</p>
<pre><code class="language-cpp">#ifndef PERSON_H
#define PERSON_H

#include &lt;string&gt;
using namespace std;

class Person {

private:
	string name;

public:	
	Person(string name): name(name) {};

	string getName() {
		return name;
	}

	void setName(string name) {
		this-&gt;name = name;
	}
};

#endif
</code></pre>
<p>Iterator.h</p>
<pre><code class="language-cpp">#ifndef ITERATOR_H
#define ITERATOR_H

class Iterator {
public:
	virtual void* next() = 0;
	virtual bool hasNext() = 0;
};

#endif
</code></pre>
<p>LinkedList.h</p>
<pre><code class="language-cpp">#ifndef LINKED_LIST_H
#define LINKED_LIST_H
#include &lt;cstdlib&gt;
#include &quot;Iterator.h&quot;

class Node {
private:
	void* data;
	Node* next;

public:
	Node(void* data): data(data), next(NULL) {};
	void* getData() { return data; }
	Node* getNext() { return next; }
	void setNext(Node* next) { this-&gt;next = next; }

};

class LinkedListIterator: public Iterator {
	Node* current;
public:
	LinkedListIterator(Node* node): current(node) {};
	void* next();
	bool hasNext();
};

class LinkedList {

private:
	Node* head;
public:
	LinkedList(): head(NULL) {};
	void add(void* data);
	bool remove(void* data);
	Iterator* getIterator();
};

#endif
</code></pre>
<p>LinkedList.cpp</p>
<pre><code class="language-cpp">#include &quot;LinkedList.h&quot;

void LinkedList::add(void* data) {
	Node* newNode = new Node(data);
	if(head == NULL) {
		head = newNode;
	} else {
		head-&gt;setNext(newNode);
	}
}

bool LinkedList::remove(void* data) {
	Node* previous = NULL;
	Node* current = head;
	while(current != NULL) {
		if(current-&gt;getData() == data) {
			if(current == head) {
				head = current-&gt;getNext();
			} else {
				previous-&gt;setNext(current-&gt;getNext());
			}
			return true;
		}
		previous = current;
		current = current-&gt;getNext();
	}
	return false;
}

Iterator* LinkedList::getIterator() {
	Iterator* it = new LinkedListIterator(this-&gt;head);
	return it;
}

bool LinkedListIterator::hasNext() {
	return current != NULL;
}

void* LinkedListIterator::next() {
	if(!hasNext())
		return NULL;
	void* data = current-&gt;getData();
	current = current-&gt;getNext();
	return data;
}
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;Person.h&quot;
#include &quot;LinkedList.h&quot;

void list(LinkedList* list) {
	cout &lt;&lt; &quot;====&quot; &lt;&lt; endl;
	Iterator* it = list-&gt;getIterator();
	while(it-&gt;hasNext()) {
		void* data = it-&gt;next();
		Person* person = (Person*) data;
		cout &lt;&lt; person-&gt;getName() &lt;&lt; endl;
	}
	cout &lt;&lt; &quot;====&quot; &lt;&lt; endl;
}

int main (int argc, char * const argv[]) {
	LinkedList* persons = new LinkedList();
	cout &lt;&lt; &quot;test keine personen: &quot; &lt;&lt; endl;
	list(persons);
	persons-&gt;add(new Person(&quot;hans wurst&quot;));
	Person peter(&quot;peter lustig&quot;);
	persons-&gt;add(&amp;peter);
	cout &lt;&lt; &quot;2 personen:&quot; &lt;&lt; endl;
	list(persons);
	bool ok = persons-&gt;remove(&amp;peter);
	cout &lt;&lt; &quot;peter entfernen erfolgreich? &quot; &lt;&lt; ok &lt;&lt; endl;
	cout &lt;&lt; &quot;ohne peter jetze:&quot; &lt;&lt; endl;
	list(persons);
    return 0;
}
</code></pre>
<p>fragen die mir beim programmieren in den sinn gekommen sind:<br />
- wann benutzt man diese syntax für konstruktoren: Node(void* data): data(data), next(NULL) {}; ? finde die komisch<br />
- wann und warum trennt man die implementierung von klassen von der definition (so wie in LinkedList.cpp/LinkedList.h)? Ich finde das nämlich unangenehm wenn der Code für eine einzige klasse über 2 dateien aufgeteilt ist. In der Person klasse hab ich es ja anders gemacht, fand ich angenehmer.<br />
- muss ich in LinkedList::remove() irgendwie speicher aufräumen oder wird das automatisch gemacht?<br />
- gibt es irgendeine möglichkeit die sichtbarkein von klassen einzurschränken? zum beispiel kann jeder die klasse Node und LinkedListIterator instantiieren, was aber keinen sinn macht. Ich hab zuerst versucht die beiden klassen in die LinkedList klasse einzunisten, aber das hat bei der implementierung nicht richtig geklappt</p>
<p>danke für die antworten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/240144/is-mein-code-so-in-ordnung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 04:49:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/240144.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 02 May 2009 15:27:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to is mein code so in ordnung? on Sat, 02 May 2009 15:27:20 GMT]]></title><description><![CDATA[<p>hi,<br />
bin anfänger, hab code geschrieben, möchte wissen was es alles an dem auszusetzen gibt und was ihr anders gemacht hättet. unter dem code stehen noch ein paar konkrete fragen, hier ist mal der quelltext:</p>
<p>Person.h</p>
<pre><code class="language-cpp">#ifndef PERSON_H
#define PERSON_H

#include &lt;string&gt;
using namespace std;

class Person {

private:
	string name;

public:	
	Person(string name): name(name) {};

	string getName() {
		return name;
	}

	void setName(string name) {
		this-&gt;name = name;
	}
};

#endif
</code></pre>
<p>Iterator.h</p>
<pre><code class="language-cpp">#ifndef ITERATOR_H
#define ITERATOR_H

class Iterator {
public:
	virtual void* next() = 0;
	virtual bool hasNext() = 0;
};

#endif
</code></pre>
<p>LinkedList.h</p>
<pre><code class="language-cpp">#ifndef LINKED_LIST_H
#define LINKED_LIST_H
#include &lt;cstdlib&gt;
#include &quot;Iterator.h&quot;

class Node {
private:
	void* data;
	Node* next;

public:
	Node(void* data): data(data), next(NULL) {};
	void* getData() { return data; }
	Node* getNext() { return next; }
	void setNext(Node* next) { this-&gt;next = next; }

};

class LinkedListIterator: public Iterator {
	Node* current;
public:
	LinkedListIterator(Node* node): current(node) {};
	void* next();
	bool hasNext();
};

class LinkedList {

private:
	Node* head;
public:
	LinkedList(): head(NULL) {};
	void add(void* data);
	bool remove(void* data);
	Iterator* getIterator();
};

#endif
</code></pre>
<p>LinkedList.cpp</p>
<pre><code class="language-cpp">#include &quot;LinkedList.h&quot;

void LinkedList::add(void* data) {
	Node* newNode = new Node(data);
	if(head == NULL) {
		head = newNode;
	} else {
		head-&gt;setNext(newNode);
	}
}

bool LinkedList::remove(void* data) {
	Node* previous = NULL;
	Node* current = head;
	while(current != NULL) {
		if(current-&gt;getData() == data) {
			if(current == head) {
				head = current-&gt;getNext();
			} else {
				previous-&gt;setNext(current-&gt;getNext());
			}
			return true;
		}
		previous = current;
		current = current-&gt;getNext();
	}
	return false;
}

Iterator* LinkedList::getIterator() {
	Iterator* it = new LinkedListIterator(this-&gt;head);
	return it;
}

bool LinkedListIterator::hasNext() {
	return current != NULL;
}

void* LinkedListIterator::next() {
	if(!hasNext())
		return NULL;
	void* data = current-&gt;getData();
	current = current-&gt;getNext();
	return data;
}
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;Person.h&quot;
#include &quot;LinkedList.h&quot;

void list(LinkedList* list) {
	cout &lt;&lt; &quot;====&quot; &lt;&lt; endl;
	Iterator* it = list-&gt;getIterator();
	while(it-&gt;hasNext()) {
		void* data = it-&gt;next();
		Person* person = (Person*) data;
		cout &lt;&lt; person-&gt;getName() &lt;&lt; endl;
	}
	cout &lt;&lt; &quot;====&quot; &lt;&lt; endl;
}

int main (int argc, char * const argv[]) {
	LinkedList* persons = new LinkedList();
	cout &lt;&lt; &quot;test keine personen: &quot; &lt;&lt; endl;
	list(persons);
	persons-&gt;add(new Person(&quot;hans wurst&quot;));
	Person peter(&quot;peter lustig&quot;);
	persons-&gt;add(&amp;peter);
	cout &lt;&lt; &quot;2 personen:&quot; &lt;&lt; endl;
	list(persons);
	bool ok = persons-&gt;remove(&amp;peter);
	cout &lt;&lt; &quot;peter entfernen erfolgreich? &quot; &lt;&lt; ok &lt;&lt; endl;
	cout &lt;&lt; &quot;ohne peter jetze:&quot; &lt;&lt; endl;
	list(persons);
    return 0;
}
</code></pre>
<p>fragen die mir beim programmieren in den sinn gekommen sind:<br />
- wann benutzt man diese syntax für konstruktoren: Node(void* data): data(data), next(NULL) {}; ? finde die komisch<br />
- wann und warum trennt man die implementierung von klassen von der definition (so wie in LinkedList.cpp/LinkedList.h)? Ich finde das nämlich unangenehm wenn der Code für eine einzige klasse über 2 dateien aufgeteilt ist. In der Person klasse hab ich es ja anders gemacht, fand ich angenehmer.<br />
- muss ich in LinkedList::remove() irgendwie speicher aufräumen oder wird das automatisch gemacht?<br />
- gibt es irgendeine möglichkeit die sichtbarkein von klassen einzurschränken? zum beispiel kann jeder die klasse Node und LinkedListIterator instantiieren, was aber keinen sinn macht. Ich hab zuerst versucht die beiden klassen in die LinkedList klasse einzunisten, aber das hat bei der implementierung nicht richtig geklappt</p>
<p>danke für die antworten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704494</guid><dc:creator><![CDATA[anfängerpeter]]></dc:creator><pubDate>Sat, 02 May 2009 15:27:20 GMT</pubDate></item><item><title><![CDATA[Reply to is mein code so in ordnung? on Sat, 02 May 2009 15:31:09 GMT]]></title><description><![CDATA[<p>edit:</p>
<pre><code class="language-cpp">head-&gt;setNext(newNode);
</code></pre>
<p>in der remove() methode ist natürlich falsch, hab es jetzt geändert in:</p>
<pre><code class="language-cpp">Node* current = head;
		while(current-&gt;getNext() != NULL)
			current = current-&gt;getNext();
		current-&gt;setNext(newNode);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1704495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704495</guid><dc:creator><![CDATA[anfängerpeter]]></dc:creator><pubDate>Sat, 02 May 2009 15:31:09 GMT</pubDate></item><item><title><![CDATA[Reply to is mein code so in ordnung? on Sat, 02 May 2009 15:38:21 GMT]]></title><description><![CDATA[<p>anfängerpeter  schrieb:</p>
<blockquote>
<p>- wann benutzt man diese syntax für konstruktoren: Node(void* data): data(data), next(NULL) {}; ? finde die komisch</p>
</blockquote>
<p>Das ist die Initialisierungsliste und die sollte dazu benutzt werden Datenmember zu initialisieren. (Probier mal ohne die eine const- Member zu haben und einen Anfangswert zuzuweisen).</p>
<p>anfängerpeter  schrieb:</p>
<blockquote>
<p>- wann und warum trennt man die implementierung von klassen von der definition (so wie in LinkedList.cpp/LinkedList.h)? Ich finde das nämlich unangenehm wenn der Code für eine einzige klasse über 2 dateien aufgeteilt ist. In der Person klasse hab ich es ja anders gemacht, fand ich angenehmer.</p>
</blockquote>
<p>Grundsätzlich sollte die Implementierung von der Schnittstelle getrennt werden, daher hast du eine .h und eine .cpp. Der Vorteil liegt darin, dass die Module, die lediglich den Header include nicht neue kompiliert werden müssen, wenn du z.B die Implementierung einer Funktion änderst. Da musst du nur die jeweilige .cpp neu kompilieren, was unter Umständen ein riesen Vorteil ist.<br />
Inline Funktionen kann man aber getrost in der Klasse definieren. Vor allem getter und setter sind beliebet, da die grundsätzlich nicht verändert werden.</p>
<p>anfängerpeter  schrieb:</p>
<blockquote>
<p>- muss ich in LinkedList::remove() irgendwie speicher aufräumen oder wird das automatisch gemacht?</p>
</blockquote>
<p>Für jeden Speicher, den du mit new/new[] anforderst bist du verantwortlich, somit musst auch du dich darum kümmern den Speicher wieder frei zu geben. (mit delete, respektive delete[]).</p>
<blockquote>
<p>- gibt es irgendeine möglichkeit die sichtbarkein von klassen einzurschränken? zum beispiel kann jeder die klasse Node und LinkedListIterator instantiieren, was aber keinen sinn macht. Ich hab zuerst versucht die beiden klassen in die LinkedList klasse einzunisten, aber das hat bei der implementierung nicht richtig geklappt</p>
</blockquote>
<p>Da gibt es verschiedene Möglichkeiten. Du kannst z.B den Konstruktor privat machen und nur einer Klasse mittels friend die Möglichkeit geben diese überhaupt zu erstellen, oder du könntest auch mit <a href="http://www.nextdawn.nl/sub/cplusplus_language/cplusplus_namespaces.php" rel="nofollow">anonymen Namensräumen</a> arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704498</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 02 May 2009 15:38:21 GMT</pubDate></item><item><title><![CDATA[Reply to is mein code so in ordnung? on Sat, 02 May 2009 16:13:58 GMT]]></title><description><![CDATA[<p>danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
das delete würde aber definitiv nicht in die remove() methode gehören, sondern vielmehr dorthin, wo remove() aufgerufen wird, oder?<br />
was passiert, wenn ich noch mehr pointer hab die auf dieses objekt zeigen und ich das dann mit delete entferne? was passiert beim nächsten aufruf von getName() wenn das objekt weg is?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704507</guid><dc:creator><![CDATA[anfängerpeter]]></dc:creator><pubDate>Sat, 02 May 2009 16:13:58 GMT</pubDate></item><item><title><![CDATA[Reply to is mein code so in ordnung? on Sat, 02 May 2009 16:44:25 GMT]]></title><description><![CDATA[<p>Grundsätzlich sollte das Objekt, respektive die Stufe, die Speicher anfordert diesen auch wieder freigeben/verwalten.</p>
<p>Wenn du noch mehr Pointer hast, die auf den selben Speicher zeigen, dann darfst du den nachher nicht mehr löschen, da das Verhalten dann undefiniert ist. (Sprich dein Programm wird mit grosser Wahrscheinlichkeit abstürzen).</p>
<p><code>getName</code> ist bei dir ungefährlich, da std::string den Speicher selbst verwaltet und du dich somit gar nicht drum kümmern musst. Allerdings ist bei dir eher das Problem bei <code>node</code> und <code>getData</code> .</p>
<p>btw:<br />
<code>using namespace std;</code> gehört fast nie in einen Header, da es den Sinn eines namespaces untergräbt. Im Header solltest du direkt den Bereichsauflöser <code>::</code> benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1704523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1704523</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 02 May 2009 16:44:25 GMT</pubDate></item></channel></rss>