<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[[C++] Mehrfachdefinition einer Funktion]]></title><description><![CDATA[<p>Ich habe ein Projekt mit 3 Dateien, einer normalen main.cpp und einer Klasse Personengruppe, die in eine .h und .cpp gesplittet sind. Meine Dateien sehen wie folgt aus:</p>
<p>main.cpp:</p>
<pre><code>#include &lt;iostream&gt;
#include &quot;Personengruppe.h&quot;

using namespace std;

int main(){
  Personengruppe gruppe_1(3);
  Personengruppe gruppe_2(2);

  // hier die beiden gruppen fuellen

  cout &lt;&lt; gruppe_1.getName() &lt;&lt; &quot; hat im Mittel &quot; &lt;&lt; gruppe_1.averageScore() &lt;&lt; &quot; Punkte.&quot; &lt;&lt; endl;
  cout &lt;&lt; gruppe_2.getName() &lt;&lt; &quot; hat im Mittel &quot; &lt;&lt; gruppe_2.averageScore() &lt;&lt; &quot; Punkte.&quot; &lt;&lt; endl;

  if (gruppe_1.averageScore() &gt; gruppe_2.averageScore())
    cout &lt;&lt; &quot;Gruppe 1 hat gewonnen!&quot; &lt;&lt; endl;
  else
    cout &lt;&lt; &quot;Gruppe 2 hat gewonnen!&quot; &lt;&lt; endl;

  return 0;
}
</code></pre>
<p>Personengruppe,h:</p>
<pre><code>#ifndef PERSONENGRUPPE_H__
#define PERSONENGRUPPE_H__

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

struct Person{
  string name;
  int score;
};

// liest genau eine Person ein
Person readPerson(){
  string name;
  int score;
  cout &lt;&lt; &quot;Name der Person eingeben: &quot;;
  cin &gt;&gt; name;
  cout &lt;&lt; &quot;Score der Person eingeben: &quot;;
  cin &gt;&gt; score;
  Person p = {name, score};
  return p;
}

class Personengruppe {
	private:
		string name;
		int quantity;
		Person* group;
	public:
		Personengruppe(int anzahl);
		string getName();
		void setName(string name);
		int getQuantity();
		void setQuantity(int quantity);
		Person* getGroup();
		void setGroup(Person* group);
		int averageScore() const;
		void addPerson(Person p);
};

#endif
</code></pre>
<p>Personengruppe.cpp</p>
<pre><code>#include &quot;Personengruppe.h&quot;

//Konstruktor
Personengruppe::Personengruppe(int anzahl)
	:quantity(anzahl)
{
	this-&gt;group = new Person[quantity];
	for(int i=0; i&lt;anzahl; i++) {
		group[i] = readPerson();
	}
}
//Set- und get Methoden
string Personengruppe::getName() {
	return this-&gt;name;
}
void Personengruppe::setName(string name) {
	this-&gt;name = name;
}
int Personengruppe::getQuantity() {
	return this-&gt;quantity;
}
void Personengruppe::setQuantity(int quantity) {
	this-&gt;quantity = quantity;
}
Person* Personengruppe::getGroup() {
	return group;
}
void Personengruppe::setGroup(Person* group) {
	this-&gt;group = group;
}
//Weitere Methoden
int Personengruppe::averageScore() const {
	int score = 0;
	for( int i = 0; i &lt; this-&gt;quantity ; i++) {
		score += this-&gt;group[i].score;
	}
	return ( score / this-&gt;quantity );
}
void Personengruppe::addPerson(Person p){
	Person* newGroup = new Person[this-&gt;quantity + 1];
	for ( int i = 0; i &lt; this-&gt;quantity; i++ ) {
		newGroup[i] = this-&gt;group[i];
	}
	this-&gt;quantity = this-&gt;quantity + 1;
	newGroup[this-&gt;quantity-1] = p;
	delete[] group;
	group = newGroup;
}
</code></pre>
<p>Wenn ich das Projekt nun kompilieren möchte, bekomme ich die Fehlermeldung, die Methode readPerson(); wäre mehrfach definiert. Dies sollte mein #ifndef-Block aber doch verhindern, oder nicht? Dazu sollte ich sagen, dass ich die Datei Personengruppe.h bis auf den Teil der in class Personengruppe{..} steht so vorgegeben bekam. Was kann ich jetzt damit machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/322779/c-mehrfachdefinition-einer-funktion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 16:35:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322779.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Jan 2014 14:43:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [C++] Mehrfachdefinition einer Funktion on Mon, 06 Jan 2014 14:43:59 GMT]]></title><description><![CDATA[<p>Ich habe ein Projekt mit 3 Dateien, einer normalen main.cpp und einer Klasse Personengruppe, die in eine .h und .cpp gesplittet sind. Meine Dateien sehen wie folgt aus:</p>
<p>main.cpp:</p>
<pre><code>#include &lt;iostream&gt;
#include &quot;Personengruppe.h&quot;

using namespace std;

int main(){
  Personengruppe gruppe_1(3);
  Personengruppe gruppe_2(2);

  // hier die beiden gruppen fuellen

  cout &lt;&lt; gruppe_1.getName() &lt;&lt; &quot; hat im Mittel &quot; &lt;&lt; gruppe_1.averageScore() &lt;&lt; &quot; Punkte.&quot; &lt;&lt; endl;
  cout &lt;&lt; gruppe_2.getName() &lt;&lt; &quot; hat im Mittel &quot; &lt;&lt; gruppe_2.averageScore() &lt;&lt; &quot; Punkte.&quot; &lt;&lt; endl;

  if (gruppe_1.averageScore() &gt; gruppe_2.averageScore())
    cout &lt;&lt; &quot;Gruppe 1 hat gewonnen!&quot; &lt;&lt; endl;
  else
    cout &lt;&lt; &quot;Gruppe 2 hat gewonnen!&quot; &lt;&lt; endl;

  return 0;
}
</code></pre>
<p>Personengruppe,h:</p>
<pre><code>#ifndef PERSONENGRUPPE_H__
#define PERSONENGRUPPE_H__

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

struct Person{
  string name;
  int score;
};

// liest genau eine Person ein
Person readPerson(){
  string name;
  int score;
  cout &lt;&lt; &quot;Name der Person eingeben: &quot;;
  cin &gt;&gt; name;
  cout &lt;&lt; &quot;Score der Person eingeben: &quot;;
  cin &gt;&gt; score;
  Person p = {name, score};
  return p;
}

class Personengruppe {
	private:
		string name;
		int quantity;
		Person* group;
	public:
		Personengruppe(int anzahl);
		string getName();
		void setName(string name);
		int getQuantity();
		void setQuantity(int quantity);
		Person* getGroup();
		void setGroup(Person* group);
		int averageScore() const;
		void addPerson(Person p);
};

#endif
</code></pre>
<p>Personengruppe.cpp</p>
<pre><code>#include &quot;Personengruppe.h&quot;

//Konstruktor
Personengruppe::Personengruppe(int anzahl)
	:quantity(anzahl)
{
	this-&gt;group = new Person[quantity];
	for(int i=0; i&lt;anzahl; i++) {
		group[i] = readPerson();
	}
}
//Set- und get Methoden
string Personengruppe::getName() {
	return this-&gt;name;
}
void Personengruppe::setName(string name) {
	this-&gt;name = name;
}
int Personengruppe::getQuantity() {
	return this-&gt;quantity;
}
void Personengruppe::setQuantity(int quantity) {
	this-&gt;quantity = quantity;
}
Person* Personengruppe::getGroup() {
	return group;
}
void Personengruppe::setGroup(Person* group) {
	this-&gt;group = group;
}
//Weitere Methoden
int Personengruppe::averageScore() const {
	int score = 0;
	for( int i = 0; i &lt; this-&gt;quantity ; i++) {
		score += this-&gt;group[i].score;
	}
	return ( score / this-&gt;quantity );
}
void Personengruppe::addPerson(Person p){
	Person* newGroup = new Person[this-&gt;quantity + 1];
	for ( int i = 0; i &lt; this-&gt;quantity; i++ ) {
		newGroup[i] = this-&gt;group[i];
	}
	this-&gt;quantity = this-&gt;quantity + 1;
	newGroup[this-&gt;quantity-1] = p;
	delete[] group;
	group = newGroup;
}
</code></pre>
<p>Wenn ich das Projekt nun kompilieren möchte, bekomme ich die Fehlermeldung, die Methode readPerson(); wäre mehrfach definiert. Dies sollte mein #ifndef-Block aber doch verhindern, oder nicht? Dazu sollte ich sagen, dass ich die Datei Personengruppe.h bis auf den Teil der in class Personengruppe{..} steht so vorgegeben bekam. Was kann ich jetzt damit machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375581</guid><dc:creator><![CDATA[Kalkihe]]></dc:creator><pubDate>Mon, 06 Jan 2014 14:43:59 GMT</pubDate></item><item><title><![CDATA[Reply to [C++] Mehrfachdefinition einer Funktion on Mon, 06 Jan 2014 14:49:51 GMT]]></title><description><![CDATA[<p>Du solltest Funktionen entweder in der Source definieren (und im Header nur deklarieren), oder im Header definieren aber mit <code>inline</code> -specifier.</p>
<p>Kurz: Kopiere einfach die Funktionsdefinition von <code>readPerson</code> von Personengruppe.h nach Personengruppe.cpp.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375586</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 06 Jan 2014 14:49:51 GMT</pubDate></item><item><title><![CDATA[Reply to [C++] Mehrfachdefinition einer Funktion on Mon, 06 Jan 2014 14:53:08 GMT]]></title><description><![CDATA[<p>Kalkihe schrieb:</p>
<blockquote>
<p>Wenn ich das Projekt nun kompilieren möchte, bekomme ich die Fehlermeldung, die Methode readPerson(); wäre mehrfach definiert.</p>
</blockquote>
<p>Ist es ja auch? Die Definition von readPerson() steht in deinem Header. Damit steht diese Definition dann in jedem .cpp File, welches diesen Header inkludiert. Schau dir mal an, für was das Schlüssenwort inline gut 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>
<p>Kalkihe schrieb:</p>
<blockquote>
<p>Dies sollte mein #ifndef-Block aber doch verhindern, oder nicht?</p>
</blockquote>
<p>Wie genau sollte der das deiner Meinung nach denn verhindern? <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/2375588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375588</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Mon, 06 Jan 2014 14:53:08 GMT</pubDate></item><item><title><![CDATA[Reply to [C++] Mehrfachdefinition einer Funktion on Mon, 06 Jan 2014 15:01:30 GMT]]></title><description><![CDATA[<p>Noch eine Erklärung zu ifdef, da du das falsch verstanden hast:<br />
Die ganzen Präprozessoranweisungen arbeiten als reine Textersetzungsmakros, lange vor dem Compiler oder gar Linker. Die verstehen nichts von der Sprache C++, die verstehen auch nichts von verschiedenen Übersetzungseinheiten. Es wird einfach eine Datei genommen und bei jedem Präprozessormakro wird eine entsprechende Textersetzung vorgenommen.</p>
<p>Hier passiert also folgendes:<br />
main.cpp wird genommen, <code>#include &quot;Personengruppe.h&quot;</code> wird durchgeführt, nun steht der Inhalt von Personengruppe.h an der Stelle. Dessen Inhalt wird auch verarbeitet. PERSONENGRUPPE_H__ ist nicht definiert, also wird es definiert und der restliche Inhalt der Datei bleibt unverändert. Dann wird main.cpp compiliert und die Daten gehen an den Linker.<br />
Dann wird nochmal ganz neu angefangen mit Personengruppe.cpp: <code>#include &quot;Personengruppe.h&quot;</code> wird durchgeführt, nun steht der Inhalt von Personengruppe.h an der Stelle. Dessen Inhalt wird auch verarbeitet. PERSONENGRUPPE_H__ ist nicht definiert, also wird es definiert und der restliche Inhalt der Datei bleibt unverändert. Dann wird personengruppe.cpp compiliert und die Daten gehen an den Linker.<br />
Dann kommt der Linker dran, der sieht in beiden eine Definition von Person readPerson() und beschwert sich.</p>
<p>Die Includeguards sind dazu da, um zu verhindern, dass ein Header mehrmals (oder in falscher Reihenfolge) in einer Übersetzungseinheit eingebunden wird. Dies käme sonst sehr oft vor, weil man oft etwas in dieser Art hat:<br />
A.h:</p>
<pre><code>#include &lt;iostream&gt;
// ...
</code></pre>
<p>B.h:</p>
<pre><code>#include &lt;iostream&gt;
// ...
</code></pre>
<p>main.cpp:</p>
<pre><code>#include &quot;A.h&quot;
#include &quot;B.h&quot;
</code></pre>
<p>Dann ist es wichtig, dass im Header iostream Includeguards sind.<br />
Mehrere Übersetzungseinheiten hingegen sind völlig unabhängig für den Präprozessor</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375590</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 06 Jan 2014 15:01:30 GMT</pubDate></item></channel></rss>