<?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[Verstaendnis Problem mit OOP]]></title><description><![CDATA[<p>Gruesst euch,</p>
<p>ich programmiere seit 4Jahren C und will jetzt ein kleines Spiel in C++ schreiben, hab aber noch Probleme mit der Umsetzung der Objekt Orientierten Programmiern. Und zwar hab ich ne Klasse InputBox, die unter anderem die Funktion &quot;SetValidValues&quot; bzw &quot;SetMultiLine&quot; implementiert. Nun moechte ich eine Klasse ableiten die IPInputBox heisst. Im prinzip die gleiche Funktionalitaet nur das man halt nicht selber die ValidValues setzten darf und MultiLine is au schmarn.</p>
<pre><code class="language-cpp">class InputBox : public IOInterface
{
public:
	/*......*/
	virtual void SetValidValues(const char* pszValidValues) 
	{ 
		SetValidValues( std::string(pszValidValues) );
	};
	virtual void SetMultiLine(bool bMultiLine) { m_bMultiLine = bMultiLine; };
/*.....*/
};
</code></pre>
<p>und</p>
<pre><code class="language-cpp">class InputBoxIP : public InputBox
{
public:

protected:
	virtual void SetValidValues(const std::string&amp; strValidValues) {};
};
</code></pre>
<p>Jetzt die Frage: waere das der richtige Weg die Funktion einfach in der abgeleiteten Klasse protected/private zu machen? Damit muesste man ja den Umweg gehen:</p>
<pre><code class="language-cpp">IPObject.InputBox::SetValidValues(&quot;blabla&quot;);
</code></pre>
<p>um die Funktion aufzurufen. Oder sollte man da ganz anders ran gehn!?</p>
<p>Greetz C0de4fun<br />
The lord gave us all life appreciate it</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269800/verstaendnis-problem-mit-oop</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 00:20:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269800.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Jul 2010 12:36:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verstaendnis Problem mit OOP on Thu, 01 Jul 2010 12:36:02 GMT]]></title><description><![CDATA[<p>Gruesst euch,</p>
<p>ich programmiere seit 4Jahren C und will jetzt ein kleines Spiel in C++ schreiben, hab aber noch Probleme mit der Umsetzung der Objekt Orientierten Programmiern. Und zwar hab ich ne Klasse InputBox, die unter anderem die Funktion &quot;SetValidValues&quot; bzw &quot;SetMultiLine&quot; implementiert. Nun moechte ich eine Klasse ableiten die IPInputBox heisst. Im prinzip die gleiche Funktionalitaet nur das man halt nicht selber die ValidValues setzten darf und MultiLine is au schmarn.</p>
<pre><code class="language-cpp">class InputBox : public IOInterface
{
public:
	/*......*/
	virtual void SetValidValues(const char* pszValidValues) 
	{ 
		SetValidValues( std::string(pszValidValues) );
	};
	virtual void SetMultiLine(bool bMultiLine) { m_bMultiLine = bMultiLine; };
/*.....*/
};
</code></pre>
<p>und</p>
<pre><code class="language-cpp">class InputBoxIP : public InputBox
{
public:

protected:
	virtual void SetValidValues(const std::string&amp; strValidValues) {};
};
</code></pre>
<p>Jetzt die Frage: waere das der richtige Weg die Funktion einfach in der abgeleiteten Klasse protected/private zu machen? Damit muesste man ja den Umweg gehen:</p>
<pre><code class="language-cpp">IPObject.InputBox::SetValidValues(&quot;blabla&quot;);
</code></pre>
<p>um die Funktion aufzurufen. Oder sollte man da ganz anders ran gehn!?</p>
<p>Greetz C0de4fun<br />
The lord gave us all life appreciate it</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919903</guid><dc:creator><![CDATA[C0de4Fun]]></dc:creator><pubDate>Thu, 01 Jul 2010 12:36:02 GMT</pubDate></item><item><title><![CDATA[Reply to Verstaendnis Problem mit OOP on Thu, 01 Jul 2010 12:52:48 GMT]]></title><description><![CDATA[<p>Das ist der falsche Ansatz. Wenn B von A erbt, dann bedeutet das, <em>B ist ein A</em>.</p>
<p>Konkret: Wenn <code>InputBoxIP</code> von <code>InputBox</code> erbt, dann bedeutet das, <code>InputBoxIP</code> <em>ist eine</em> <code>InputBox</code> . Wenn Du nun aber <code>InputBoxIP</code> Funktionalität von <code>InputBox</code> wegnimmst, dann ist <code>InputBoxIP</code> eben <em>keine</em> <code>InputBox</code> mehr (verhält sich nicht mehr gleich).</p>
<p>Das bedeutet, <code>InputBoxIP</code> sollte nicht von <code>InputBox</code> erben, sondern es vielleicht als Aggregat (also Member) benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919912</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 01 Jul 2010 12:52:48 GMT</pubDate></item><item><title><![CDATA[Reply to Verstaendnis Problem mit OOP on Thu, 01 Jul 2010 13:17:59 GMT]]></title><description><![CDATA[<p>Hmm ok ich versteh zwar was du meinst glaub ich, aber wie soll ich das dann umsetzten. Wie gesagt InputBox hat ansich alles was die InputBoxIP auch braucht nur halt die 2 Funktionen zu viel bzw sind halt da unsinnig, da man ja nur Zahl fuer die IP eingeben koennen soll und multi line is auch ein schmarn. Sollte ich dann die Funktionen die beide besitzen noch in eine ober Klasse packen z.B. IInterface und von der erben dann beide?</p>
<p>Ich zeig einfach mal noch mehr Code. Und zwar hier erst mal von InputBox:</p>
<pre><code class="language-cpp">void InputBox::Draw()
	{
		InitValues();

		SaveConsoleState();

		if( m_bBorder )
			DrawBorder();
		if( m_bSpace )
			DrawSpace();

		for( LineVec::iterator iter = m_vecLines.begin(); iter != m_vecLines.end(); iter++)
		{
			//iter-&gt;erase();
			iter-&gt;resize(m_rectText.right);
		}

		CONSOLE::SetBackgroundColour(m_ColBack);
		CONSOLE::SetForegroundColour(m_ColText);

		CONSOLE::SetCursorPos( m_rectText);

		m_coordCurCourserPos.Y = m_rectText.top;
		m_coordCurCourserPos.X = m_rectText.left + m_strText.size();

		std::cout &lt;&lt; m_strText;

		m_bStarted = true;
		m_Con.RegisterInputFunc(CONSOLE::KEYBOARD, this, InputHandler);

		while(m_bStarted)
			Sleep(500);

		m_Con.RemoveInputFunc(InputHandler);

		RestoreConsoleState();

	}

	void InputBox::InputHandler(PINPUT_RECORD pInputRec, void* pData)
	{
		InputBox* pInput = (InputBox*) pData;
		pInput-&gt;m_pCurInputRec = pInputRec;

		if( pInputRec-&gt;Event.KeyEvent.bKeyDown == 1 )
		{
			if(pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode ==pInput-&gt;m_VKNext)
				pInput-&gt;Next();
			else if(pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == pInput-&gt;m_VKPrev)			
				pInput-&gt;Prev();
			else if(pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == pInput-&gt;m_VKScrollUp)
				pInput-&gt;Up_Down(true);
			else if(pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == pInput-&gt;m_VKScrollDown)
				pInput-&gt;Up_Down(false);
			else if(pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == pInput-&gt;m_VKClose)
				pInput-&gt;Close();
			else if( pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == VK_BACK)
				pInput-&gt;Backspace();
			else if( pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == VK_END)
				pInput-&gt;End();
			else if( pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == VK_HOME)
				pInput-&gt;Home();
			else
				pInput-&gt;PrintInput();
		}	
	}
</code></pre>
<p>Und da ja die ganzen Input Funktionen wie &quot;Up_Down&quot; oder &quot;Prev&quot; virtuel sind hab ich mir gedacht ich erb einafch von InputBox ueberschreib die Funktionen das z.B. wenn man an der Position 3 ist und der Prev Key drueckt wird man zur 5. Position springt.</p>
<p>Ich hoff mal man versteht mein Gedankengang und ihr mir helfen koennt auf den richtigen Weg zu gelangen.</p>
<p>Me praise de King: King Selassie<br />
C0de4Fun</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919928</guid><dc:creator><![CDATA[C0de4Fun]]></dc:creator><pubDate>Thu, 01 Jul 2010 13:17:59 GMT</pubDate></item><item><title><![CDATA[Reply to Verstaendnis Problem mit OOP on Thu, 01 Jul 2010 16:11:12 GMT]]></title><description><![CDATA[<p><code>InputBoxIP</code> darf von <code>InputBox</code> nicht öffentlich erben, wenn gewisse Methoden nicht mehr erlaubt sind. Ich würde eine Zwischenklasse einfügen, sodass <code>InputBoxIP</code> und <code>InputBox</code> nicht mehr übereinander in der Hierarchie stehen.</p>
<pre><code class="language-cpp">class InputBoxBase
{
    // gemeinsame Schnittstelle
};

class InputBox : public InputBoxBase // evtl. umbenennen
{
    // deine beiden Funktionen
};

class InputBoxIO : public InputBoxBase
{
    // andere Dinge
};
</code></pre>
<p>Warum sind die zwei Methoden in <code>InputBox</code> überhaupt virtuell? Überschreiben sie andere virtuelle Funktionen oder sind sie zum ersten Mal deklariert und sind dazu gedacht, von abgeleiteten Klassen überschrieben zu werden?</p>
<p>Übrigens:</p>
<p>C0de4Fun schrieb:</p>
<blockquote>
<pre><code class="language-cpp">if(pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode ==pInput-&gt;m_VKNext)
				pInput-&gt;Next();
			else if(pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == pInput-&gt;m_VKPrev)			
				pInput-&gt;Prev();
			else if(pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == pInput-&gt;m_VKScrollUp)
				pInput-&gt;Up_Down(true);
			else if(pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == pInput-&gt;m_VKScrollDown)
				pInput-&gt;Up_Down(false);
			else if(pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == pInput-&gt;m_VKClose)
				pInput-&gt;Close();
			else if( pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == VK_BACK)
				pInput-&gt;Backspace();
			else if( pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == VK_END)
				pInput-&gt;End();
			else if( pInputRec-&gt;Event.KeyEvent.wVirtualKeyCode == VK_HOME)
				pInput-&gt;Home();
			else
				pInput-&gt;PrintInput();
</code></pre>
</blockquote>
<p>Nach vier Jahren C kennst du sicher <code>switch</code> . Das ist um einiges übersichtlicher und effizienter. Allerdings gibt es noch bessere Alternativen zu manuellen Fallunterscheidungen, wirf dazu einen Blick in <a href="http://magazin.c-plusplus.net/artikel/Object-Switching" rel="nofollow">diesen Artikel</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920018</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 01 Jul 2010 16:11:12 GMT</pubDate></item><item><title><![CDATA[Reply to Verstaendnis Problem mit OOP on Fri, 02 Jul 2010 06:49:27 GMT]]></title><description><![CDATA[<p>Hey ho,</p>
<p>joa ok dann mach ich das so, das man noch ne andere Base Klasse fuer die beiden Input Dinger hat. Danke Mr. Nexus und natuerlich auch Tachyon :).</p>
<p>Uebringens:<br />
glaube dir ist vielleicht beim schnelle ueberfliegen des Codes nicht aufgefallen, dass in den if Dingern ein Paar mal Variablen vorkommen und nicht nur Konstanten und somit faellt doch switch flach ( oder geht switch in C++ auch mit Variablen!?). Und danke fuer den Artikle werd ich mir spaeter mal anguggen wenn ich wider fit bin. Is noch zu frueh <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    />.</p>
<p>Gruesse C0de4fun</p>
<p>€ noch vergessen: noe die zwei Funktionen sind zum ersten mal da und ich hab se nur virtuel gemacht damit ich wie im ersten Post in InputBoxIP die ueberschreiben kann und protected setzten kann damit der Zugriff verweigert wird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920248</guid><dc:creator><![CDATA[C0de4Fun]]></dc:creator><pubDate>Fri, 02 Jul 2010 06:49:27 GMT</pubDate></item><item><title><![CDATA[Reply to Verstaendnis Problem mit OOP on Fri, 02 Jul 2010 07:38:19 GMT]]></title><description><![CDATA[<p>C0de4Fun schrieb:</p>
<blockquote>
<p>glaube dir ist vielleicht beim schnelle ueberfliegen des Codes nicht aufgefallen, dass in den if Dingern ein Paar mal Variablen vorkommen und nicht nur Konstanten und somit faellt doch switch flach ( oder geht switch in C++ auch mit Variablen!?).</p>
</blockquote>
<p>Seit wann geht switch nur für Konstanten?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920267</guid><dc:creator><![CDATA[beselbube]]></dc:creator><pubDate>Fri, 02 Jul 2010 07:38:19 GMT</pubDate></item><item><title><![CDATA[Reply to Verstaendnis Problem mit OOP on Fri, 02 Jul 2010 07:43:37 GMT]]></title><description><![CDATA[<p>Seit wann gibt's denn C oder C++?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920271</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Fri, 02 Jul 2010 07:43:37 GMT</pubDate></item><item><title><![CDATA[Reply to Verstaendnis Problem mit OOP on Fri, 02 Jul 2010 08:30:30 GMT]]></title><description><![CDATA[<p>beselbube schrieb:</p>
<blockquote>
<p>C0de4Fun schrieb:</p>
<blockquote>
<p>glaube dir ist vielleicht beim schnelle ueberfliegen des Codes nicht aufgefallen, dass in den if Dingern ein Paar mal Variablen vorkommen und nicht nur Konstanten und somit faellt doch switch flach ( oder geht switch in C++ auch mit Variablen!?).</p>
</blockquote>
<p>Seit wann geht switch nur für Konstanten?!</p>
</blockquote>
<p>Seit dem das der Compiler sagt:</p>
<blockquote>
<p>error C2051: case expression not constant</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1920295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920295</guid><dc:creator><![CDATA[C0de4Fun]]></dc:creator><pubDate>Fri, 02 Jul 2010 08:30:30 GMT</pubDate></item></channel></rss>