<?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[Basisklasse undefiniert | Compilerwarnung]]></title><description><![CDATA[<p>Hallo!</p>
<p>Klasse MultiplacationTrainer erbt von RechenTrainer.</p>
<p>es kommt zu einer Fehlermeldung.</p>
<blockquote>
<p>1&gt;------ Neues Erstellen gestartet: Projekt: RechenTrainerOO, Konfiguration: Debug Win32 ------<br />
1&gt;Die Zwischen- und Ausgabedateien für das Projekt &quot;RechenTrainerOO&quot; mit der Konfiguration &quot;Debug|Win32&quot; werden gelöscht.<br />
1&gt;Kompilieren...<br />
1&gt;main.cpp<br />
1&gt;Menu.cpp<br />
1&gt;MultiplikationTrainer.cpp<br />
1&gt;RechenTrainer.cpp<br />
1&gt;w:\c++\workspace\rechentrainer\rechentraineroo\multiplikationtrainer.h(7) : error C2504: 'RechenTrainer': Basisklasse undefiniert<br />
1&gt;Code wird generiert...<br />
1&gt;Das Buildprotokoll wurde unter &quot;file://w:\C++\workspace\RechenTrainer\RechenTrainerOO\Debug\BuildLog.htm&quot; gespeichert.<br />
1&gt;RechenTrainerOO - 1 Fehler, 0 Warnung(en)<br />
========== Alles neu erstellen: 0 erfolgreich, Fehler bei 1, 0 übersprungen ==========</p>
</blockquote>
<p>Ich poste mal alle klassen...</p>
<pre><code class="language-cpp">#ifndef RECHENTRAINER
#define RECHENTRAINER

#include &quot;Menu.h&quot;
#include &lt;ctime&gt;
#include &lt;sstream&gt;
#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

class Menu;
struct Status;

class RechenTrainer{

protected:
	bool _addNow;
	int random();

public:
	RechenTrainer(void);
	virtual ~RechenTrainer(void);

	void rechne(Menu* menu);

};

#endif
</code></pre>
<pre><code class="language-cpp">#include &quot;RechenTrainer.h&quot;
using namespace std;

RechenTrainer::RechenTrainer(void){
}

RechenTrainer::~RechenTrainer(void){
}

void RechenTrainer::rechne( Menu* menu){
	cout &lt;&lt; &quot;Addition/Substraktionstraining\n&quot;;
	while(menu-&gt;_status._tasks-- &gt; 0){
		int a = random();
		int b = random();

		int result;
		if(_addNow){
			result = a+b;
		} else {
			result = a-b;
		}
		stringstream ss_a;
		stringstream ss_b;
		string str = &quot;&quot;;
		ss_a &lt;&lt; a;
		str += ss_a.str();
		str += ((_addNow) ? &quot; + &quot; : &quot; - &quot;);
		ss_b &lt;&lt; b;
		str += ss_b.str();
		str += &quot; = &quot;;
		cout &lt;&lt; str ;

		int userResult = menu-&gt;numberFromUser();
		stringstream ss_user;
		ss_user &lt;&lt; userResult;
		str += ss_user.str();

		if(userResult == result){
			cout &lt;&lt; &quot;richtig &quot; &lt;&lt; result;
			str += &quot; richtig &quot;;
		} else {
			cout &lt;&lt; &quot; falsch &quot; &lt;&lt; result;
			str += &quot; falsch &quot;;
			stringstream temp;
			temp &lt;&lt; result;
			str += temp.str();
		}
		cout &lt;&lt; endl;
		_addNow = !_addNow;
		menu-&gt;_status._overallTasks++;
	}//while
}

int RechenTrainer::random(){
    int random_integer  = (rand() % 100) +1;
    return random_integer; 
}
</code></pre>
<pre><code class="language-cpp">#ifndef MULTITRAINER
#define MULTITRAINER

#include &quot;RechenTrainer.h&quot;
class Menu;

class MultiplikationTrainer : public RechenTrainer{
public:
	MultiplikationTrainer(void);
	~MultiplikationTrainer(void);

	void rechne(Menu* menu);
};

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

MultiplikationTrainer::MultiplikationTrainer(void)
{
}

MultiplikationTrainer::~MultiplikationTrainer(void)
{
}

void MultiplikationTrainer::rechne( Menu* menu){
	cout &lt;&lt; &quot;Addition/Substraktionstraining\n&quot;;
	while(menu-&gt;_status._tasks-- &gt; 0){
		int a = random();
		int b = random();

		int result = a*b;;
		stringstream ss_a;
		stringstream ss_b;
		string str = &quot;&quot;;
		ss_a &lt;&lt; a;
		str += ss_a.str();
		str += &quot; * &quot;;
		ss_b &lt;&lt; b;
		str += ss_b.str();
		str += &quot; = &quot;;
		cout &lt;&lt; str ;

		int userResult = menu-&gt;numberFromUser();
		stringstream ss_user;
		ss_user &lt;&lt; userResult;
		str += ss_user.str();

		if(userResult == result){
			cout &lt;&lt; &quot;richtig &quot; &lt;&lt; result;
			str += &quot; richtig &quot;;
		} else {
			cout &lt;&lt; &quot; falsch &quot; &lt;&lt; result;
			str += &quot; falsch &quot;;
			stringstream temp;
			temp &lt;&lt; result;
			str += temp.str();
		}
		cout &lt;&lt; endl;
		menu-&gt;_status._overallTasks++;
	}//while
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/289732/basisklasse-undefiniert-compilerwarnung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 23:51:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289732.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Jul 2011 20:33:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Basisklasse undefiniert | Compilerwarnung on Mon, 11 Jul 2011 20:33:09 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Klasse MultiplacationTrainer erbt von RechenTrainer.</p>
<p>es kommt zu einer Fehlermeldung.</p>
<blockquote>
<p>1&gt;------ Neues Erstellen gestartet: Projekt: RechenTrainerOO, Konfiguration: Debug Win32 ------<br />
1&gt;Die Zwischen- und Ausgabedateien für das Projekt &quot;RechenTrainerOO&quot; mit der Konfiguration &quot;Debug|Win32&quot; werden gelöscht.<br />
1&gt;Kompilieren...<br />
1&gt;main.cpp<br />
1&gt;Menu.cpp<br />
1&gt;MultiplikationTrainer.cpp<br />
1&gt;RechenTrainer.cpp<br />
1&gt;w:\c++\workspace\rechentrainer\rechentraineroo\multiplikationtrainer.h(7) : error C2504: 'RechenTrainer': Basisklasse undefiniert<br />
1&gt;Code wird generiert...<br />
1&gt;Das Buildprotokoll wurde unter &quot;file://w:\C++\workspace\RechenTrainer\RechenTrainerOO\Debug\BuildLog.htm&quot; gespeichert.<br />
1&gt;RechenTrainerOO - 1 Fehler, 0 Warnung(en)<br />
========== Alles neu erstellen: 0 erfolgreich, Fehler bei 1, 0 übersprungen ==========</p>
</blockquote>
<p>Ich poste mal alle klassen...</p>
<pre><code class="language-cpp">#ifndef RECHENTRAINER
#define RECHENTRAINER

#include &quot;Menu.h&quot;
#include &lt;ctime&gt;
#include &lt;sstream&gt;
#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

class Menu;
struct Status;

class RechenTrainer{

protected:
	bool _addNow;
	int random();

public:
	RechenTrainer(void);
	virtual ~RechenTrainer(void);

	void rechne(Menu* menu);

};

#endif
</code></pre>
<pre><code class="language-cpp">#include &quot;RechenTrainer.h&quot;
using namespace std;

RechenTrainer::RechenTrainer(void){
}

RechenTrainer::~RechenTrainer(void){
}

void RechenTrainer::rechne( Menu* menu){
	cout &lt;&lt; &quot;Addition/Substraktionstraining\n&quot;;
	while(menu-&gt;_status._tasks-- &gt; 0){
		int a = random();
		int b = random();

		int result;
		if(_addNow){
			result = a+b;
		} else {
			result = a-b;
		}
		stringstream ss_a;
		stringstream ss_b;
		string str = &quot;&quot;;
		ss_a &lt;&lt; a;
		str += ss_a.str();
		str += ((_addNow) ? &quot; + &quot; : &quot; - &quot;);
		ss_b &lt;&lt; b;
		str += ss_b.str();
		str += &quot; = &quot;;
		cout &lt;&lt; str ;

		int userResult = menu-&gt;numberFromUser();
		stringstream ss_user;
		ss_user &lt;&lt; userResult;
		str += ss_user.str();

		if(userResult == result){
			cout &lt;&lt; &quot;richtig &quot; &lt;&lt; result;
			str += &quot; richtig &quot;;
		} else {
			cout &lt;&lt; &quot; falsch &quot; &lt;&lt; result;
			str += &quot; falsch &quot;;
			stringstream temp;
			temp &lt;&lt; result;
			str += temp.str();
		}
		cout &lt;&lt; endl;
		_addNow = !_addNow;
		menu-&gt;_status._overallTasks++;
	}//while
}

int RechenTrainer::random(){
    int random_integer  = (rand() % 100) +1;
    return random_integer; 
}
</code></pre>
<pre><code class="language-cpp">#ifndef MULTITRAINER
#define MULTITRAINER

#include &quot;RechenTrainer.h&quot;
class Menu;

class MultiplikationTrainer : public RechenTrainer{
public:
	MultiplikationTrainer(void);
	~MultiplikationTrainer(void);

	void rechne(Menu* menu);
};

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

MultiplikationTrainer::MultiplikationTrainer(void)
{
}

MultiplikationTrainer::~MultiplikationTrainer(void)
{
}

void MultiplikationTrainer::rechne( Menu* menu){
	cout &lt;&lt; &quot;Addition/Substraktionstraining\n&quot;;
	while(menu-&gt;_status._tasks-- &gt; 0){
		int a = random();
		int b = random();

		int result = a*b;;
		stringstream ss_a;
		stringstream ss_b;
		string str = &quot;&quot;;
		ss_a &lt;&lt; a;
		str += ss_a.str();
		str += &quot; * &quot;;
		ss_b &lt;&lt; b;
		str += ss_b.str();
		str += &quot; = &quot;;
		cout &lt;&lt; str ;

		int userResult = menu-&gt;numberFromUser();
		stringstream ss_user;
		ss_user &lt;&lt; userResult;
		str += ss_user.str();

		if(userResult == result){
			cout &lt;&lt; &quot;richtig &quot; &lt;&lt; result;
			str += &quot; richtig &quot;;
		} else {
			cout &lt;&lt; &quot; falsch &quot; &lt;&lt; result;
			str += &quot; falsch &quot;;
			stringstream temp;
			temp &lt;&lt; result;
			str += temp.str();
		}
		cout &lt;&lt; endl;
		menu-&gt;_status._overallTasks++;
	}//while
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2091557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091557</guid><dc:creator><![CDATA[Dit_]]></dc:creator><pubDate>Mon, 11 Jul 2011 20:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse undefiniert | Compilerwarnung on Mon, 11 Jul 2011 20:42:53 GMT]]></title><description><![CDATA[<p>Bindet die Menu.h (möglicherweise indirekt) die MultiplikationTrainer.h ein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091558</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 11 Jul 2011 20:42:53 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse undefiniert | Compilerwarnung on Mon, 11 Jul 2011 21:15:45 GMT]]></title><description><![CDATA[<p>ja du hast recht, dran lags. ich brauche die aber im Menu <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>
<p>P.S. wieso kommt es aber dann zum Fehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091565</guid><dc:creator><![CDATA[Dit_]]></dc:creator><pubDate>Mon, 11 Jul 2011 21:15:45 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse undefiniert | Compilerwarnung on Mon, 11 Jul 2011 21:36:47 GMT]]></title><description><![CDATA[<p>Dit_ schrieb:</p>
<blockquote>
<p>P.S. wieso kommt es aber dann zum Fehler?</p>
</blockquote>
<p>Da bindet die RechenTrainer.h die Menu.h ein, diese bindet die MultiplikationTrainer.h ein, diese versucht die RechenTrainer.h einzubinden, aber dort sind nun die Includeguards aktiviert worden und daher passiert nicht und die Basisklasse ist nicht bekannt, wenn sie gebraucht wird.</p>
<blockquote>
<p>ich brauche die aber im Menu <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>
</blockquote>
<p>Solche zyklischen Abhängigkeiten kann man eigentlich immer auflösen. Denk dran, dass du nicht immer die volle Definition brauchst, eine Vorwärtsdeklaration reicht oft auch. Ich sehe, du machst davon schon reichlich gebrauch, bindest aber trotzdem noch die entsprechenden Header ein. Ich sehe gar nicht, wozu die Menu.h in der RechenTrainer.h benötigt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091568</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 11 Jul 2011 21:36:47 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse undefiniert | Compilerwarnung on Mon, 11 Jul 2011 21:46:13 GMT]]></title><description><![CDATA[<p>menu hat mehrere Rechentrainer</p>
<pre><code class="language-cpp">#ifndef MENU
#define MENU

#include &quot;RechenTrainer.h&quot;
#include &quot;MultiplikationTrainer.h&quot;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cstdlib&gt;
#include &lt;map&gt;

using namespace std;

class Menu{

public:
	Menu(void);
	~Menu(void);

	/**
	* Speichert die  Informationen über die Anzahl der Aufgaben 
	* und die Anzahl der richtigen Lösungen
	*/
	struct Status {
		int _overallTasks;
		int _tasks;
		int _points; 

		Status(){
			reset();
		}
		void reset(){
			_overallTasks = 0;
			_tasks = 5;
			_points = 0;
		}

	};

	char getInput();
	void training();
	void printStatus();
	int resultInPercent();
	int numberFromUser() const;

	Status _status;

private:
	void printMenu();
	void setTaskCount();

};

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

Menu::Menu(void){
}

Menu::~Menu(void){
}
void Menu::printMenu(){
	std::cout &lt;&lt; &quot;################## M E N U ##################&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;# ~: Addition/Substraktion&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;# *: Multiplikation&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;# ?: Wahrsager&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;# ----------&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;# t: Anzahl der Aufgaben Aendern. [Aktuell: &quot;&lt;&lt; _status._tasks &lt;&lt;&quot;]&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;# p: Punkte ausgeben&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;# q: Beenden&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; &quot;#############################################&quot; &lt;&lt; std::endl;
}

char Menu::getInput(){
	char input;
	cin &gt;&gt; input;
	return input;
}
int Menu::numberFromUser() const{
	//TODO
}

void Menu::setTaskCount(){
	//TODO
}

void Menu::training(){
	map &lt;char, RechenTrainer*&gt; trainerMap;
	trainerMap['~'] = new RechenTrainer();
//	trainerMap['*'] = new MultiplikationTrainer();

	RechenTrainer* _currentTrainer;

	printMenu();

	while(true){

		char ch = getInput();

		switch(ch){

			case 't':
				setTaskCount();
				break;

			case 'p':
				printStatus();
				break;

			case 'q':
				std::cout &lt;&lt; &quot;Programm wird beendet...&quot; &lt;&lt; std::endl;
				return;

			default:
				_currentTrainer = trainerMap[ch];
				if(_currentTrainer == 0){
					std::cout &lt;&lt; &quot;Unbekannter Befehl&quot; &lt;&lt; std::endl;
					continue;
				} else {
					_currentTrainer-&gt;rechne(this);
				}
		}//switch
		printStatus();
		_status.reset();
		printMenu();
	}//while
}

int Menu::resultInPercent(){
	//dreifache-liniare-optimierung
	return 100*_status._points /_status._overallTasks; 
}

void Menu::printStatus(){
	//TODO
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2091573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091573</guid><dc:creator><![CDATA[Dit_]]></dc:creator><pubDate>Mon, 11 Jul 2011 21:46:13 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse undefiniert | Compilerwarnung on Mon, 11 Jul 2011 21:54:24 GMT]]></title><description><![CDATA[<p>In der menu.h sehe ich überhaupt nichts, was die Rechentrainer verwenden will - dort brauchst du vermutlich nicht einmal Forward-Deklarationen. Wenn du die Trainer bei der Implementation des Menüs benötigst, reicht es, sie genau dort (in der menu.cpp) einzubinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091576</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 11 Jul 2011 21:54:24 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse undefiniert | Compilerwarnung on Mon, 11 Jul 2011 22:02:50 GMT]]></title><description><![CDATA[<p>ok vielen Dank! :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091578</guid><dc:creator><![CDATA[Dit_]]></dc:creator><pubDate>Mon, 11 Jul 2011 22:02:50 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse undefiniert | Compilerwarnung on Tue, 12 Jul 2011 08:15:03 GMT]]></title><description><![CDATA[<p>In deiner Methode <code>Menu::training()</code> erzeugst du ein Speicherleck. Du allozierst dynamisch ein Trainer Objekt und legst es in die Map (Zeile 36), rufst für dieses Objekt allerdings keine <code>delete</code> auf. Entweder solltest du am Ende der Methode über alle Elemente der map laufen und die Elemente per <code>delete</code> löschen, oder du verwendest geeignete Pointer (shared- / unique_pointer), oder du verwendest den passenden pointer_container aus den boost Bibliotheken (falls verfügbar).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091649</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 12 Jul 2011 08:15:03 GMT</pubDate></item></channel></rss>