<?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[eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden]]></title><description><![CDATA[<p>Ich habe zwei Klassen, KURS und BENUTZER, wobei der BENUTZER eine Variable vom Typ KURS hat, in der gespeichert ist, welchen Kurs er gewählt hat.<br />
In der Klasse KURS solls aber ein Feld von BENUTZERn geben, eine Teilnehmerliste halt. Die Fehlerzahl hab ich schon von 52 auf 18 runtergebracht, ich glaub, das Problem ist, dass ich die eine Klasse nicht vor der anderen definieren kann. ('BENUTZER::BELEGT_KURS' verwendet undefiniertes class 'KURS')<br />
Wenn das doch irgwann klappt, will ich noch eine Kurs-Liste erschaffen, also ein Feld von KURSen, das haut grade auch net hin <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="😞"
    /><br />
Hier meine Klassen, die in der gleichen Datei sind wie main(), leicht gekürzt:</p>
<pre><code class="language-cpp">class BENUTZER{ 
	private:
		string NAME;            // Name
		long MATR_NR;           // Matrikelnummer
		KURS BELEGT_KURS;       // Kurs, der belegt werden soll
	public:
		BENUTZER(string NM, long MNR); // Konstruktor: Name und Matr.Nr. als Eigenschaft,
		int WAEHLE_KURS(KURS); 
		long GET_MATR_NR(void){ return MATR_NR;}
		string GET_NAME(void){ return NAME;}
};
BENUTZER::BENUTZER(string NM, long MNR):NAME(NM), MATR_NR(MNR){ // Konstruktor-Methode für Klasse KURS
	cout &lt;&lt; &quot;Neuer BENUTZER erzeugt !\n\n&quot;;
}
int BENUTZER::WAEHLE_KURS(KURS){
	if(KURS.GET_TEILN_ANZAHL()&lt;10){
		KURS.AUFNEHMEN(BENUTZER);
		BELEGT_KURS=KURS;
		return 1;
	}
	return 0; // Kurs konnte nicht gewaehlt werden -&gt; neu waehlen lassen!!!
}
class KURS{ 
	private:
		string NAME;               // Kursname
		int TEILN_ANZAHL;          // 3&lt;=Teilnemheranzahl&lt;=10
		BENUTZER* TEILN_LISTE;  // Liste der Teilnehmer
	public:
		KURS(string NM); // Konstruktor: Name als Eigenschaft
		int ERH_TEILN_ANZAHL(void); // Teilnehmer-Anzahl erhoehen
		bool VORHANDEN(BENUTZER); // Schaut, ob Benutzer schon vorhanden
		int AUFNEHMEN(BENUTZER); // Nimmt neuen Benutzer auf
		string GET_NAME(void){return NAME;}
		int GET_TEILN_ANZAHL(void){return TEILN_ANZAHL;}
		BENUTZER GET_TEILN_LISTE(int a){return TEILN_LISTE[a];}
};
KURS::KURS(string NM):NAME(NM){ // Konstruktor-Methode für Klasse KURS
	TEILN_ANZAHL=0; // Beim Erzeugen gibt es 0 Teilnehmer
	//BENUTZER* TEILN_LISTE; geht net?
	BENUTZER* TEILN_LISTE = (BENUTZER*)malloc(10*sizeof(BENUTZER));	//Speicher reserviert
	cout &lt;&lt; &quot;Neuer Kurs erzeugt !\n\n&quot;;
}
int KURS::ERH_TEILN_ANZAHL(void){ 
// TEILN_ANZAHL wird um 1 erhoeht, wenn noch keine 10 Teilnehmer da
// gibt return 0 zurueck, wenn Erhoehung nicht mehr moeglich
	if(TEILN_ANZAHL&lt;10){
		TEILN_ANZAHL++;
		return 1;
	}
	return 0;
}
bool KURS::VORHANDEN(BENUTZER USER){ 
// Untersucht, ob die Matrikelnummer und der Name schon in der Kursliste steht
// Wenn MART_NR UND(!) NAME identisch sind, wird sofort return 1 zurueckgegeben
// die Funktion bricht dann ab und fuehrt return 0 nicht mehr aus.
	int i;
	for(i=0; i&lt;TEILN_ANZAHL; i++){ 
		if((TEILN_LISTE[i].GET_MATR_NR()==USER.GET_MATR_NR())&amp;&amp;(TEILN_LISTE[i].GET_NAME()==USER.GET_NAME()))
                	return 1;
	}
	return 0;
}
int KURS::AUFNEHMEN(BENUTZER USER){ // Definition der METHODE 	&quot;AUFNEHMEN&quot;
	if(TEILN_ANZAHL&lt;10){
		TEILN_LISTE[TEILN_ANZAHL]=USER;
        TEILN_ANZAHL++;
		return 1;
	}
	return 0;
}
</code></pre>
<p>Danke für eure Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/288278/eigener-datentyp-soll-als-attribut-einer-anderen-eigenen-klasse-verwendet-werden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 01:26:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288278.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 13 Jun 2011 20:27:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Mon, 13 Jun 2011 20:27:35 GMT]]></title><description><![CDATA[<p>Ich habe zwei Klassen, KURS und BENUTZER, wobei der BENUTZER eine Variable vom Typ KURS hat, in der gespeichert ist, welchen Kurs er gewählt hat.<br />
In der Klasse KURS solls aber ein Feld von BENUTZERn geben, eine Teilnehmerliste halt. Die Fehlerzahl hab ich schon von 52 auf 18 runtergebracht, ich glaub, das Problem ist, dass ich die eine Klasse nicht vor der anderen definieren kann. ('BENUTZER::BELEGT_KURS' verwendet undefiniertes class 'KURS')<br />
Wenn das doch irgwann klappt, will ich noch eine Kurs-Liste erschaffen, also ein Feld von KURSen, das haut grade auch net hin <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="😞"
    /><br />
Hier meine Klassen, die in der gleichen Datei sind wie main(), leicht gekürzt:</p>
<pre><code class="language-cpp">class BENUTZER{ 
	private:
		string NAME;            // Name
		long MATR_NR;           // Matrikelnummer
		KURS BELEGT_KURS;       // Kurs, der belegt werden soll
	public:
		BENUTZER(string NM, long MNR); // Konstruktor: Name und Matr.Nr. als Eigenschaft,
		int WAEHLE_KURS(KURS); 
		long GET_MATR_NR(void){ return MATR_NR;}
		string GET_NAME(void){ return NAME;}
};
BENUTZER::BENUTZER(string NM, long MNR):NAME(NM), MATR_NR(MNR){ // Konstruktor-Methode für Klasse KURS
	cout &lt;&lt; &quot;Neuer BENUTZER erzeugt !\n\n&quot;;
}
int BENUTZER::WAEHLE_KURS(KURS){
	if(KURS.GET_TEILN_ANZAHL()&lt;10){
		KURS.AUFNEHMEN(BENUTZER);
		BELEGT_KURS=KURS;
		return 1;
	}
	return 0; // Kurs konnte nicht gewaehlt werden -&gt; neu waehlen lassen!!!
}
class KURS{ 
	private:
		string NAME;               // Kursname
		int TEILN_ANZAHL;          // 3&lt;=Teilnemheranzahl&lt;=10
		BENUTZER* TEILN_LISTE;  // Liste der Teilnehmer
	public:
		KURS(string NM); // Konstruktor: Name als Eigenschaft
		int ERH_TEILN_ANZAHL(void); // Teilnehmer-Anzahl erhoehen
		bool VORHANDEN(BENUTZER); // Schaut, ob Benutzer schon vorhanden
		int AUFNEHMEN(BENUTZER); // Nimmt neuen Benutzer auf
		string GET_NAME(void){return NAME;}
		int GET_TEILN_ANZAHL(void){return TEILN_ANZAHL;}
		BENUTZER GET_TEILN_LISTE(int a){return TEILN_LISTE[a];}
};
KURS::KURS(string NM):NAME(NM){ // Konstruktor-Methode für Klasse KURS
	TEILN_ANZAHL=0; // Beim Erzeugen gibt es 0 Teilnehmer
	//BENUTZER* TEILN_LISTE; geht net?
	BENUTZER* TEILN_LISTE = (BENUTZER*)malloc(10*sizeof(BENUTZER));	//Speicher reserviert
	cout &lt;&lt; &quot;Neuer Kurs erzeugt !\n\n&quot;;
}
int KURS::ERH_TEILN_ANZAHL(void){ 
// TEILN_ANZAHL wird um 1 erhoeht, wenn noch keine 10 Teilnehmer da
// gibt return 0 zurueck, wenn Erhoehung nicht mehr moeglich
	if(TEILN_ANZAHL&lt;10){
		TEILN_ANZAHL++;
		return 1;
	}
	return 0;
}
bool KURS::VORHANDEN(BENUTZER USER){ 
// Untersucht, ob die Matrikelnummer und der Name schon in der Kursliste steht
// Wenn MART_NR UND(!) NAME identisch sind, wird sofort return 1 zurueckgegeben
// die Funktion bricht dann ab und fuehrt return 0 nicht mehr aus.
	int i;
	for(i=0; i&lt;TEILN_ANZAHL; i++){ 
		if((TEILN_LISTE[i].GET_MATR_NR()==USER.GET_MATR_NR())&amp;&amp;(TEILN_LISTE[i].GET_NAME()==USER.GET_NAME()))
                	return 1;
	}
	return 0;
}
int KURS::AUFNEHMEN(BENUTZER USER){ // Definition der METHODE 	&quot;AUFNEHMEN&quot;
	if(TEILN_ANZAHL&lt;10){
		TEILN_LISTE[TEILN_ANZAHL]=USER;
        TEILN_ANZAHL++;
		return 1;
	}
	return 0;
}
</code></pre>
<p>Danke für eure Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077669</guid><dc:creator><![CDATA[ChrisB]]></dc:creator><pubDate>Mon, 13 Jun 2011 20:27:35 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Mon, 13 Jun 2011 20:30:20 GMT]]></title><description><![CDATA[<p>Alter Schwede kennst Du keine Kleinbuchstaben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077670</guid><dc:creator><![CDATA[Augenkrebs]]></dc:creator><pubDate>Mon, 13 Jun 2011 20:30:20 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Mon, 13 Jun 2011 20:30:58 GMT]]></title><description><![CDATA[<p>Der Trick nennt sich forward-Deklaration: Für KURS Benötigst du nicht die komplette Definition von BENUTZER, sondern nur den Namen <code>class BENUTZER;</code> .</p>
<p>PS: malloc() mit nicht-POD Datentypen kann nur übel enden - stattdessen solltest du lieber new verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077672</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 13 Jun 2011 20:30:58 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Mon, 13 Jun 2011 20:33:41 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>PS: malloc() mit nicht-POD Datentypen kann nur übel enden - stattdessen solltest du lieber new verwenden.</p>
</blockquote>
<p>Darf ich empfehlen, beides nicht zu nehmen? Das schreit nach einem Standardcontainer.</p>
<p>@Threadersteller: Kannst du das eigentlich selber gut lesen? Das sieht ja schrecklich aus mit den Großbuchstaben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077673</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 13 Jun 2011 20:33:41 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Mon, 13 Jun 2011 20:59:34 GMT]]></title><description><![CDATA[<p>Joa, ich würd für Ressourcen-Anfragen auch lieber ein RAII-Objekt verwenden, zB std::tr1::shared_ptr. Wesentlich sicherer und vermeidet Ausnahme-unsicheren Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077684</guid><dc:creator><![CDATA[cvcv]]></dc:creator><pubDate>Mon, 13 Jun 2011 20:59:34 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Mon, 13 Jun 2011 21:01:26 GMT]]></title><description><![CDATA[<p>Ich kann C schon einigermaßen gut und arbeit mich grad mit nem Skript in C++ ein, die Großbuchstaben ham mich auch gestört, ich dacht halt, des is bei eigenen Klassen so üblich <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="😃"
    /><br />
Ich hab vor die zwei Klassendefinitionen schon</p>
<pre><code class="language-cpp">class BENUTZER; class KURS;
</code></pre>
<p>eingefügt aber hilft nix. Geht das mit new... genauso wie in Java? Standardcontainer hab ich noch net gehört, kp <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077686</guid><dc:creator><![CDATA[ChrisB]]></dc:creator><pubDate>Mon, 13 Jun 2011 21:01:26 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Mon, 13 Jun 2011 21:09:31 GMT]]></title><description><![CDATA[<p>Forward-Deklarationen gibt es afaik auch in C - für die Typdeklaration von KURS reicht die Forward-Deklaration, für die Methodendefinitionen braucht der Compiler die kompletten Typen.</p>
<p>Standard-Container sind z.B. std::vector&lt;&gt;. new ist die C++ Variante für manuelle Speicherverwaltung - und im Nachhinein ist ein vector&lt;&gt; tatsächlich günstiger für die Verwaltung. (und im übrigen: Was machst du eigentlich, wenn ein Benutzer mehrere Kurse belegen will?)</p>
<p>PS: Nein, Großbuchstaben sind in C++ genausowenig üblich wie in C <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2077687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077687</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 13 Jun 2011 21:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Mon, 13 Jun 2011 21:28:01 GMT]]></title><description><![CDATA[<p>Danke übrigens für die schnellen Antworten. Hab die Reihenfolge geändert</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
using namespace std;

class KURS;
class BENUTZER{ 
	private:
		string NAME;            // Name
		long MATR_NR;           // Matrikelnummer
		KURS BELEGT_KURS;       // Kurs, der belegt werden soll
	public:
		BENUTZER(string NM, long MNR); // Konstruktor: Name und Matr.Nr. als Eigenschaft,
		int WAEHLE_KURS(KURS); // ACHTUNG, WENN KURSWAHL NICHT MOEGLICH!!!
		long GET_MATR_NR(void){ 
			return MATR_NR;
		}
		string GET_NAME(void){ 
			return NAME;
		}
};
class BENUTZER;
class KURS{ 
	private:
		string NAME;               // Kursname
		int TEILN_ANZAHL;          // 3&lt;=Teilnemheranzahl&lt;=10
		BENUTZER* TEILN_LISTE;  // Liste der Teilnehmer
	public:
		KURS(string NM); // Konstruktor: Name als Eigenschaft
		int ERH_TEILN_ANZAHL(void); // Teilnehmer-Anzahl erhoehen
		bool VORHANDEN(BENUTZER); // Schaut, ob Benutzer schon vorhanden
		int AUFNEHMEN(BENUTZER); // Nimmt neuen Benutzer auf
		string GET_NAME(void){
			return NAME;
		}
		int GET_TEILN_ANZAHL(void){
			return TEILN_ANZAHL;
		}
		BENUTZER GET_TEILN_LISTE(int a){
			return TEILN_LISTE[a];
		}
};
BENUTZER::BENUTZER(string NM, long MNR):NAME(NM), MATR_NR(MNR){ // Konstruktor-Methode für Klasse KURS
	cout &lt;&lt; &quot;Neuer BENUTZER erzeugt !\n\n&quot;;
}
int BENUTZER::WAEHLE_KURS(KURS){ // Definition der METHODE 	&quot;WAEHLE_KURS&quot;
	if(KURS.GET_TEILN_ANZAHL()&lt;10){
		KURS.AUFNEHMEN(BENUTZER);
		BELEGT_KURS=KURS;
		return 1;
	}
	return 0; // Kurs konnte nicht gewaehlt werden -&gt; neu waehlen lassen!!!
}
KURS::KURS(string NM):NAME(NM){ // Konstruktor-Methode für Klasse KURS
	TEILN_ANZAHL=0; // Beim Erzeugen gibt es 0 Teilnehmer

	BENUTZER* TEILN_LISTE = new BENUTZER[10];
	cout &lt;&lt; &quot;Neuer Kurs erzeugt !\n\n&quot;;
}
int KURS::ERH_TEILN_ANZAHL(void){ // Definition der METHODE 	&quot;ERH_TEILN_ANZAHL&quot;
// TEILN_ANZAHL wird um 1 erhoeht, wenn noch keine 10 Teilnehmer da
// gibt return 0 zurueck, wenn Erhoehung nicht mehr moeglich
	if(TEILN_ANZAHL&lt;10){
		TEILN_ANZAHL++;
		return 1;
	}
	return 0;
}
bool KURS::VORHANDEN(BENUTZER USER){ // Definition der METHODE &quot;VORHANDEN&quot;
// Untersucht, ob die Matrikelnummer und der Name schon in der Kursliste steht
// Wenn MART_NR UND(!) NAME identisch sind, wird sofort return 1 zurueckgegeben
// die Funktion bricht dann ab und fuehrt return 0 nicht mehr aus.
	int i;
	for(i=0; i&lt;TEILN_ANZAHL; i++){ 
		if((TEILN_LISTE[i].GET_MATR_NR()==USER.GET_MATR_NR())&amp;&amp;(TEILN_LISTE[i].GET_NAME()==USER.GET_NAME()))
                	return 1;
	}
	return 0;
}
int KURS::AUFNEHMEN(BENUTZER USER){ // Definition der METHODE 	&quot;AUFNEHMEN&quot;
	if(TEILN_ANZAHL&lt;10){
		TEILN_LISTE[TEILN_ANZAHL]=USER;
        TEILN_ANZAHL++;
		return 1;
	}
	return 0;
}
</code></pre>
<p>geht aber trotzdem net,</p>
<pre><code>'BENUTZER::BELEGT_KURS' verwendet undefiniertes class 'KURS'
</code></pre>
<p>wie wendet man Standard-Container an, vector&lt;KURS&gt; liste; liste[0]=new KURS(&quot;blablubb&quot;); usw <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Ein Teilnehmer darf nur an einem Kurs teilnehmen <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/2077696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077696</guid><dc:creator><![CDATA[ChrisB]]></dc:creator><pubDate>Mon, 13 Jun 2011 21:28:01 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Mon, 13 Jun 2011 21:41:43 GMT]]></title><description><![CDATA[<p>ChrisB schrieb:</p>
<blockquote>
<p>Geht aber trotzdem net,</p>
<pre><code>'BENUTZER::BELEGT_KURS' verwendet undefiniertes class 'KURS'
</code></pre>
</blockquote>
<p>Benutzer enthält ein komplettes Objekt vom Typ Kurs - dafür ist die komplette Definition notwendig. Kurs hat nur einen Zeiger auf Benutzer, da reicht eine Forward-Deklaration.</p>
<blockquote>
<p>wie wendet man Standard-Container an, vector&lt;KURS&gt; liste; liste[0]=new KURS(&quot;blablubb&quot;); usw <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Fast:</p>
<pre><code class="language-cpp">class Kurs
{
  vector&lt;Benutzer&gt; teilnehmer;
public:
  Kurs()
  {
    ...
  }

  anmelden(const Benutzer&amp; neu)
  {
    teilnehmer.pus_back(neu);
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2077701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077701</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 13 Jun 2011 21:41:43 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Mon, 13 Jun 2011 22:38:46 GMT]]></title><description><![CDATA[<p>Hab jetzt noch mehr Fehler als vorher :sad:</p>
<pre><code>1&gt;..\LNcpp2\ln2-klein.cpp(44) : error C2027: Verwendung des undefinierten Typs &quot;Benutzer&quot;
1&gt;        ..\LNcpp2\ln2-klein.cpp(18): Siehe Deklaration von 'Benutzer'
1&gt;..\LNcpp2\ln2-klein.cpp(44) : error C2228: Links von &quot;.get_matr_nr&quot; muss sich eine Klasse/Struktur/Union befinden.
1&gt;..\LNcpp2\ln2-klein.cpp(44) : error C2027: Verwendung des undefinierten Typs &quot;Benutzer&quot;
1&gt;        ..\LNcpp2\ln2-klein.cpp(18): Siehe Deklaration von 'Benutzer'
1&gt;..\LNcpp2\ln2-klein.cpp(44) : error C2228: Links von &quot;.get_matr_nr&quot; muss sich eine Klasse/Struktur/Union befinden.
1&gt;..\LNcpp2\ln2-klein.cpp(44) : error C2027: Verwendung des undefinierten Typs &quot;Benutzer&quot;
1&gt;        ..\LNcpp2\ln2-klein.cpp(18): Siehe Deklaration von 'Benutzer'
1&gt;..\LNcpp2\ln2-klein.cpp(44) : error C2228: Links von &quot;.get_name&quot; muss sich eine Klasse/Struktur/Union befinden.
1&gt;..\LNcpp2\ln2-klein.cpp(44) : error C2027: Verwendung des undefinierten Typs &quot;Benutzer&quot;
1&gt;        ..\LNcpp2\ln2-klein.cpp(18): Siehe Deklaration von 'Benutzer'
1&gt;..\LNcpp2\ln2-klein.cpp(44) : error C2228: Links von &quot;.get_name&quot; muss sich eine Klasse/Struktur/Union befinden.
1&gt;..\LNcpp2\ln2-klein.cpp(60) : error C2027: Verwendung des undefinierten Typs &quot;Benutzer&quot;
1&gt;        ..\LNcpp2\ln2-klein.cpp(18): Siehe Deklaration von 'Benutzer'
1&gt;..\LNcpp2\ln2-klein.cpp(113) : error C2512: 'Kurs': Kein geeigneter Standardkonstruktor verfügbar
1&gt;..\LNcpp2\ln2-klein.cpp(132) : error C2662: 'Kurs::get_teiln_anzahl': this-Zeiger kann nicht von 'const Kurs' in 'Kurs &amp;' konvertiert werden
1&gt;        Durch die Konvertierung gehen Qualifizierer verloren
1&gt;..\LNcpp2\ln2-klein.cpp(133) : error C2275: 'Benutzer': Ungültige Verwendung dieses Typs als Ausdruck
1&gt;..\LNcpp2\ln2-klein.cpp(176) : error C2512: 'Kurs': Kein geeigneter Standardkonstruktor verfügbar
1&gt;..\LNcpp2\ln2-klein.cpp(177) : error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich.
1&gt;..\LNcpp2\ln2-klein.cpp(177) : error C2372: 'nr': Neudefinition; unterschiedliche Dereferenzierungstypen
1&gt;        ..\LNcpp2\ln2-klein.cpp(175): Siehe Deklaration von 'nr'
1&gt;..\LNcpp2\ln2-klein.cpp(177) : error C2075: 'nr': für die Initialisierung eines Arrays sind geschweifte Klammern erforderlich
1&gt;..\LNcpp2\ln2-klein.cpp(177) : error C2539: &quot;new&quot;: &quot;Kurs&quot; ist kein Standardkonstruktor zur Initialisierung von Objektarrays.
1&gt;        ..\LNcpp2\ln2-klein.cpp(19): Siehe Deklaration von 'Kurs'
1&gt;..\LNcpp2\ln2-klein.cpp(178) : error C2372: 'nr': Neudefinition; unterschiedliche Dereferenzierungstypen
1&gt;        ..\LNcpp2\ln2-klein.cpp(175): Siehe Deklaration von 'nr'
1&gt;..\LNcpp2\ln2-klein.cpp(178) : error C2075: 'nr': für die Initialisierung eines Arrays sind geschweifte Klammern erforderlich
1&gt;..\LNcpp2\ln2-klein.cpp(178) : error C2539: &quot;new&quot;: &quot;Kurs&quot; ist kein Standardkonstruktor zur Initialisierung von Objektarrays.
1&gt;        ..\LNcpp2\ln2-klein.cpp(19): Siehe Deklaration von 'Kurs'
1&gt;..\LNcpp2\ln2-klein.cpp(179) : error C2372: 'nr': Neudefinition; unterschiedliche Dereferenzierungstypen
1&gt;        ..\LNcpp2\ln2-klein.cpp(175): Siehe Deklaration von 'nr'
1&gt;..\LNcpp2\ln2-klein.cpp(179) : error C2075: 'nr': für die Initialisierung eines Arrays sind geschweifte Klammern erforderlich
1&gt;..\LNcpp2\ln2-klein.cpp(179) : error C2539: &quot;new&quot;: &quot;Kurs&quot; ist kein Standardkonstruktor zur Initialisierung von Objektarrays.
1&gt;        ..\LNcpp2\ln2-klein.cpp(19): Siehe Deklaration von 'Kurs'
1&gt;..\LNcpp2\ln2-klein.cpp(223) : error C2360: Initialisierung von 'teilnehmer' durch 'case'-Marke übersprungen
1&gt;        ..\LNcpp2\ln2-klein.cpp(202): Siehe Deklaration von 'teilnehmer'
1&gt;..\LNcpp2\ln2-klein.cpp(243) : error C2361: Initialisierung von 'teilnehmer' durch 'default'-Marke übersprungen
1&gt;        ..\LNcpp2\ln2-klein.cpp(202): Siehe Deklaration von 'teilnehmer'
1&gt;Das Buildprotokoll wurde unter &quot;file://d:\Users\Admin\Documents\Visual Studio 2005\Projects\InfoII\LNcpp2\ln2-klein\Debug\BuildLog.htm&quot; gespeichert.
1&gt;ln2-klein - 25 Fehler, 0 Warnung(en)
</code></pre>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
using namespace std;

class Benutzer;
class Kurs{ 
	private:
		string name;               // Kursname
		int teiln_anzahl;          // 3&lt;=teilnemheranzahl&lt;=10
		//Benutzer* teiln_liste;  // liste der teilnehmer
		vector&lt;Benutzer&gt; teiln_liste;
	public:
		Kurs(string NM){ // Konstruktor: name als Eigenschaft
			name=NM;
			teiln_anzahl=0; // Beim Erzeugen gibt es 0 teilnehmer
			cout &lt;&lt; &quot;Neuer Kurs erzeugt !\n\n&quot;;
		}
		//~Kurs(); // Destruktor
		int ERH_teiln_anzahl(void){ // teilnehmer-anzahl erhoehen
// teiln_anzahl wird um 1 erhoeht, wenn noch keine 10 teilnehmer da
// gibt return 0 zurueck, wenn Erhoehung nicht mehr moeglich
			if(teiln_anzahl&lt;10){
				teiln_anzahl++;
				return 1;
			}
			return 0;
		}
		bool vorhanden(Benutzer user){ // Schaut, ob Benutzer schon vorhanden
			int i;
			for(i=0; i&lt;teiln_anzahl; i++){ 
			if((teiln_liste.at(i).get_matr_nr()==user.get_matr_nr())&amp;&amp;(teiln_liste.at(i).get_name()==user.get_name()))
				return 1;
			}
			return 0;
		}
		int aufnehmen(const Benutzer&amp; neu){ // Nimmt neuen Benutzer auf
			if(teiln_anzahl&lt;10){
				//[teiln_anzahl]=user;
				teiln_liste.push_back(neu);
				teiln_anzahl++;
				return 1;
			}
			return 0;
		}
		string get_name(void){		return name;}
		int get_teiln_anzahl(void){		return teiln_anzahl;}
		Benutzer get_teiln_liste(int a){		return teiln_liste.at(a);}
};
class Benutzer{ 
	private:
		string name;            // name
		long matr_nr;           // Matrikelnummer
		Kurs belegt_Kurs;       // Kurs, der belegt werden soll
	public:
		Benutzer(string NM, long Mnr){ // Konstruktor: name und Matr.nr. als Eigenschaft,
		// gewuenschter Kurs wird ueber eigene Methode gesetzt, 
			name=NM;
			matr_nr=Mnr;
			cout &lt;&lt; &quot;Neuer Benutzer erzeugt !\n\n&quot;;
		}
		//~Benutzer(); // Destruktor
		int waehle_Kurs(const Kurs KRS){ // ACHTUNG, WENN KursWAHL NICHT MOEGLICH!!!
			if(KRS.get_teiln_anzahl()&lt;10){
				KRS.aufnehmen(Benutzer);
				belegt_Kurs=(Kurs)KRS;
				return 1;
			}
			return 0; // Kurs konnte nicht gewaehlt werden -&gt; neu waehlen lassen!!!
		}
		long get_matr_nr(void){ 
			return matr_nr;
		}
		string get_name(void){ 
			return name;
		}
};
...
</code></pre>
<p>Mein Bett ruft. Vielleicht hab ich morgen mehr Ideen <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/2077717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077717</guid><dc:creator><![CDATA[ChrisB]]></dc:creator><pubDate>Mon, 13 Jun 2011 22:38:46 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Mon, 13 Jun 2011 22:56:24 GMT]]></title><description><![CDATA[<p>Du kannst in einer Klasse keine Instanz ihrer selbst haben. Wie sollte das gehen? Und was soll das bringen?</p>
<p>P.S.: Jetzt kann ich schon meine Antworten im Minutentakt recyclen:<br />
<a href="http://www.c-plusplus.net/forum/p2077719#2077719" rel="nofollow">http://www.c-plusplus.net/forum/p2077719#2077719</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077721</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 13 Jun 2011 22:56:24 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Mon, 13 Jun 2011 23:11:10 GMT]]></title><description><![CDATA[<p>Hm, stimmt. Irgendwie komisch <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="🙄"
    /> Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077726</guid><dc:creator><![CDATA[ChrisB]]></dc:creator><pubDate>Mon, 13 Jun 2011 23:11:10 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Tue, 14 Jun 2011 08:43:22 GMT]]></title><description><![CDATA[<p>Den Fehler</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Du kannst in einer Klasse keine Instanz ihrer selbst haben.</p>
</blockquote>
<p>hab ich ausgebessert, komm aber nie unter 18 Fehler und mach bezüglich des Attributs KURS in der Klasse BENUTZER etwas was ich sonst net mach: Aufgeben. Hab KURS durch ne int ersetzt.<br />
Mein neues Problem scheint der Umgang mit einem Vector zu sein:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
using namespace std;
class Benutzer{
	private:
		string name;            // name
		long matr_nr;           // Matrikelnummer
		int belegt_KursNr;       // Kurs, der belegt werden soll
	public:
		Benutzer(string NM, long Mnr){ 
			name=NM;
			matr_nr=Mnr;
		}
};
main(){
       char a, b;
       int c;
       Benutzer dummy=new Benutzer(&quot;dummy&quot;, 42);
       vector&lt;Benutzer&gt; teiln_liste(); // Soll ein Feld von Benutzern geben
       a='c';
       for(c=0; c&lt;10; c++) //Belegung
                //teiln_liste[c]=&amp;dummy;       //?????
                teiln_liste.push_back(dummy);       //?????
       for(c=0; c&lt;10; c++){//Ausgabe
                tmp=teiln_liste[c].get_name();
                cout &lt;&lt; tmp &lt;&lt; &quot;\n&quot;;
                }
       system(&quot;pause&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2077822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077822</guid><dc:creator><![CDATA[ChrisB]]></dc:creator><pubDate>Tue, 14 Jun 2011 08:43:22 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Tue, 14 Jun 2011 09:40:34 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Benutzer dummy=new Benutzer(&quot;dummy&quot;, 42);
</code></pre>
<p>So läuft das nicht. Richtig wäre:</p>
<pre><code class="language-cpp">Benutzer dummy(&quot;dummy&quot;, 42);
</code></pre>
<p>Ausserdem solltest du alle Membervariablen initialisieren, und dazu die Konstruktor-Initialisierungsliste verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077854</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 14 Jun 2011 09:40:34 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Tue, 14 Jun 2011 09:53:59 GMT]]></title><description><![CDATA[<p>also ist das problem (ich hab zufällig gerade dasselbe problemchen gehabt), dass man 2 klassen hat, die sich gegenseitig als member haben. ergo würde daraus wie bei einer klasse die sich selsbt als member hat, folgen, dass sie sich rekursiv beinhalten und so ihre größe theoretisch ins unendliche wachsen würde. aber genau diese zyklische abhängigkeit unterbindet der compiler und spuckt den fehler C2079 (Microsoft Visual C++ 2010 Pro)<br />
Bsp:</p>
<pre><code class="language-cpp">class A;
class B;

class A{
    B b;
};
class B {
    A a;
};

int main()
{
    A crasher;
    return 0x0;
}
</code></pre>
<p>entfernen kann man das problem indem man zum einen anders designt(einfache aussage) oder einen der beiden als pointer (smart pointer ist auch ok) in die andere klasse setzt...<br />
Bsp:</p>
<pre><code class="language-cpp">class A;
class B;

class A{
    B b;
};
class B {
    std::shared_pointer&lt;A&gt; a;
};

int main()
{
    A crasher;
    return 0x0;
}
</code></pre>
<p>nachteil ist hier halt, dass man dereferenzieren muss bei jedem zugriff...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077859</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 14 Jun 2011 09:53:59 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Tue, 14 Jun 2011 10:48:42 GMT]]></title><description><![CDATA[<p>Eine normale einfache Liste kann ich inzwischen machen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
using namespace std;
class Benutzer
{
private:
	string name;            // name
	long matr_nr;           // Matrikelnummer
	int kursNr;		// Kurs, der belegt werden soll
public:
	Benutzer(const string&amp; nname, const long mmatr_nr, const int kkursNr)
	:name(nname), matr_nr(mmatr_nr), kursNr(kkursNr){}
	void set_name(const string&amp; nname){name = nname;} //z.B. fuer spaetere Namensaenderung
	void set_matr_nr(const long mmatr_nr){matr_nr=mmatr_nr;}
	void set_kursNr(const int kkursNr){kursNr=kkursNr;}
	string get_name(void){return name;}
	long get_matr_nr(void){return matr_nr;}
	long get_kursNr(void){return kursNr;}
};
// neuen Datentypen definieren
typedef vector&lt;Benutzer&gt; BenutzerListe;
string tmp;
int main(){
	BenutzerListe alleBenutzer;
	Benutzer student(&quot;Eins&quot;, 13, 1);
	alleBenutzer.push_back(student);
	/*
	Benutzerliste studenten;
	studenten.push_back(const new Benutzer(&quot;zwei&quot;, 14));
	alleBenutzer.push_back(studenten[1]);
	*/
	for(unsigned long i = 0; i &lt; alleBenutzer.size(); ++i)
		cout &lt;&lt; (alleBenutzer[i]).get_name() &lt;&lt; (alleBenutzer[i]).get_matr_nr() &lt;&lt; endl;
	system(&quot;pause&quot;);
	return 0;
}
</code></pre>
<p>Jetzt möcht ich aber mehr als einen Benutzer erzeugen, also wieder ein Vektor??? aber wie? Den alten Benutzer löschen und nochmal verwenden klappt auch net:(</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077881</guid><dc:creator><![CDATA[ChrisB]]></dc:creator><pubDate>Tue, 14 Jun 2011 10:48:42 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Tue, 14 Jun 2011 11:48:31 GMT]]></title><description><![CDATA[<p>Wie sehen denn die Beziehungen zwischen Kursen und Benutzern aus, das ist doch mit Sicherheit eine M:N Beziehung, oder nicht? Kannst du das nicht so modellieren?</p>
<pre><code class="language-cpp">class Kurs;
class Benutzer;

typedef shared_pt&lt;Kurs&gt; KursPtr;
typedef shared_ptr&lt;Benutzer&gt; BenutzerPtr;

class Kurs
{
   friend void belege_kurs( BenutzerPtr&amp; b, KursPtr&amp; k );

   ...
   std::vector&lt;BenutzerPtr&gt; Teilnehmer_;

   void schreibe_ein( const BenutzerPtr&amp; b )
   {
      // TO DO: Duplikate prüfen
      Teilnehmer_.push_back( b );
   }
   ...
};

class Benutzer
{
   friend void belege_kurs( BenutzerPtr&amp; b, KursPtr&amp; k );
   ...
   std::vector&lt;KursPtr&gt; Kurse_;
   ...

   void nimm_teil( const KursPtr&amp; k )
   {
      // TO DO: Duplikate prüfen
      Kurse_.push_back( k );
   }
};

void belege_kurs( BenutzerPtr&amp; b, KursPtr&amp; k )
{
   b-&gt;nimm_teil( k );
   k-&gt;schreibe_ein( b );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2077923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077923</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 14 Jun 2011 11:48:31 GMT</pubDate></item><item><title><![CDATA[Reply to eigener Datentyp soll als Attribut einer anderen eigenen Klasse verwendet werden on Tue, 14 Jun 2011 13:55:29 GMT]]></title><description><![CDATA[<p>Also, Danke für eure Hilfe! <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 />
Verwende jetzt</p>
<pre><code class="language-cpp">Benutzer student[n];
student[studNr].NewBenutzer(name, mtrnr);
</code></pre>
<p>weil ein normaler Konstruktor nicht bei Arrays funktioniert, d.h.</p>
<pre><code>Benutzer student[studNr](name, mtrnr);
</code></pre>
<p>geht eben leider net.<br />
Scheint momentan zu laufen, glaub ich kriegs jetzt hin <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/2078009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2078009</guid><dc:creator><![CDATA[ChrisB]]></dc:creator><pubDate>Tue, 14 Jun 2011 13:55:29 GMT</pubDate></item></channel></rss>