<?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[Verständnisfrage Programmentwurf]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich möchte mir ein variables Menü für die Konsole programmieren.<br />
Folgende Ausgangssituation:<br />
Ich habe ein Hauptmenü mit 5 Menüpunkten (Ebene 1). Jedes dieser 5 Menüpunkte soll maximal 5 weitere Untermenüpunkte bereitstellen.<br />
Also sind wir jetzt bei 5*5 Menüpunkten maximal. (Ebene 2)<br />
Es soll aber noch eine 3. Eben dazu kommen, bei der nochmal jedes dieser 5 Untermenüpunkte maximal 5 Unterpunkte enthalten soll.<br />
Somit wären wir bei 5*5*5 maximal mögliche Menüpunkte.</p>
<p>Meine Frage ist jetzt wie ich das in C++ umsetzen kann. Erstelle ich eine Klasse für das Hauptmenü und leite davon dann jeweils eine Klasse pro Ebene ab und hätte somit maximal 3 Objekte zu erstellen, oder sollte ich für jeden Menüpunkt ein Objekt erstellen?<br />
Das Ziel soll hier sein, dass ich bei der Erstellung des Menüs angeben kann, wieviele Unterpunkte benötigt werden.<br />
Ein Beispiel:</p>
<p>1, 2, 3, 4, 5 (Menüpunkte im Hauptmenü)<br />
jetzt soll unter Menüpunkt 1 weitere 3 Unterpunkte vorhanden sein:<br />
1.1, 1.2, 1.3 aber 1.4 und 1.5 sollen nicht belegt sein<br />
Und unter Menüpunkt 2 sollen 5 Unterpunkte erstellt werden:<br />
2.1, 2.2, 2.3, 2.4, 2.5<br />
Unter Hauptmenüpunkt 3, 4 und 5 sollen z.B. jeweils direkt zu der Aufgabe führen.</p>
<p>So dass ich mir im Endeffekt später für verschieden Aufgaben ein entsprechendes Menü zusammenstellen kann. Wichtig soll hier auch sein, dass, wenn ich die Menüpunkte 1.1, 1.2, 1.3 habe, der Menüpunkt 1.4 und 1.5 nicht auswählbar sind.</p>
<p>Ich wäre für ein paar Denkanstöße sehr dankbar.</p>
<p>Vielen Dank im Voraus,<br />
mkG Nas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285929/verständnisfrage-programmentwurf</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 03:29:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285929.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Apr 2011 00:32:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisfrage Programmentwurf on Sat, 30 Apr 2011 00:32:11 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich möchte mir ein variables Menü für die Konsole programmieren.<br />
Folgende Ausgangssituation:<br />
Ich habe ein Hauptmenü mit 5 Menüpunkten (Ebene 1). Jedes dieser 5 Menüpunkte soll maximal 5 weitere Untermenüpunkte bereitstellen.<br />
Also sind wir jetzt bei 5*5 Menüpunkten maximal. (Ebene 2)<br />
Es soll aber noch eine 3. Eben dazu kommen, bei der nochmal jedes dieser 5 Untermenüpunkte maximal 5 Unterpunkte enthalten soll.<br />
Somit wären wir bei 5*5*5 maximal mögliche Menüpunkte.</p>
<p>Meine Frage ist jetzt wie ich das in C++ umsetzen kann. Erstelle ich eine Klasse für das Hauptmenü und leite davon dann jeweils eine Klasse pro Ebene ab und hätte somit maximal 3 Objekte zu erstellen, oder sollte ich für jeden Menüpunkt ein Objekt erstellen?<br />
Das Ziel soll hier sein, dass ich bei der Erstellung des Menüs angeben kann, wieviele Unterpunkte benötigt werden.<br />
Ein Beispiel:</p>
<p>1, 2, 3, 4, 5 (Menüpunkte im Hauptmenü)<br />
jetzt soll unter Menüpunkt 1 weitere 3 Unterpunkte vorhanden sein:<br />
1.1, 1.2, 1.3 aber 1.4 und 1.5 sollen nicht belegt sein<br />
Und unter Menüpunkt 2 sollen 5 Unterpunkte erstellt werden:<br />
2.1, 2.2, 2.3, 2.4, 2.5<br />
Unter Hauptmenüpunkt 3, 4 und 5 sollen z.B. jeweils direkt zu der Aufgabe führen.</p>
<p>So dass ich mir im Endeffekt später für verschieden Aufgaben ein entsprechendes Menü zusammenstellen kann. Wichtig soll hier auch sein, dass, wenn ich die Menüpunkte 1.1, 1.2, 1.3 habe, der Menüpunkt 1.4 und 1.5 nicht auswählbar sind.</p>
<p>Ich wäre für ein paar Denkanstöße sehr dankbar.</p>
<p>Vielen Dank im Voraus,<br />
mkG Nas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056328</guid><dc:creator><![CDATA[Nasghat]]></dc:creator><pubDate>Sat, 30 Apr 2011 00:32:11 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Programmentwurf on Sat, 30 Apr 2011 03:58:51 GMT]]></title><description><![CDATA[<p>Schau dir einfach mal GUI-Frameworks an. Läuft eigentlich so gut wie immer auf Menu und MenuItem heraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056337</guid><dc:creator><![CDATA[fjiewcjewiohvcweuioh]]></dc:creator><pubDate>Sat, 30 Apr 2011 03:58:51 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Programmentwurf on Sat, 30 Apr 2011 10:27:23 GMT]]></title><description><![CDATA[<p>Sowas ist ein einfaches Beispiel für das Composite Entwurfsmuster.<br />
Ein Menu besteht aus Einträgen, die jeweils irgendeinen Befehl darstellen oder wieder ein Menu sind.<br />
Mal ein Beispiel:<br />
Znächst eine Schnittstelle für alle Einträge in einem Menu</p>
<pre><code class="language-cpp">// menu_item.hpp
#include &lt;string&gt;
class MenuItem
{
public:
	virtual const std::string&amp; Name() const = 0;
	void operator()() const
	{
		std::cout &lt;&lt; &quot;Ihre Wahl: &quot; &lt;&lt; Name() &lt;&lt; &quot;\n&quot;;
		Perform();
	}
private:
	virtual void Perform() const = 0;		
};
</code></pre>
<p>Ein Eintrag der nicht ein Untermenu ist, ist z.B. so implementiert:</p>
<pre><code class="language-cpp">// menu_command.hpp
#include &quot;menu_item.hpp&quot;
#include &lt;memory&gt;
#include &lt;functionl&gt;

typedef std::function&lt;void (void)&gt; Action;

class MenuCommand : public MenuItem
{
public:
	static std::shared_ptr&lt;MenuItem&gt; Create(const std::string&amp; name, Action action)
	{
		return std::shared_ptr&lt;MenuItem&gt;(new MenuCommand(name, action));
	}

	const std::string&amp; Name() const
	{
		return name_;
	}

private:
	MenuCommand(const std::string&amp; name, Action action) :
		action_(action), name_(name)
	{
	}

	void Perform() const
	{
		action_();
	}

	std::string name_;
	Action action_;
};
</code></pre>
<p>Ein Menu, egal ob Hauptmenu unter Untermenu ist auch ein MenuItem:</p>
<pre><code class="language-cpp">// menu.hpp
#include &quot;menu_item.hpp&quot;
#include &lt;ostream&gt;
#include &lt;vector&gt;

class Menu : public MenuItem
{
public:
	static std::shared_ptr&lt;Menu&gt; Create(const std::string&amp; name, std::ostream&amp; os = std::cout)
	{
		return std::shared_ptr&lt;Menu&gt;(new Menu(name, os));
	}

	Menu(const std::string name, std::ostream&amp; os = std::cout) :
	  name_(name), os_(&amp;os)
	{

	}

	Menu&amp; AddItem(std::shared_ptr&lt;MenuItem&gt; item)
	{
		items_.push_back(item);
		return *this;
	}

	Menu&amp; AddSubMenu(const std::string&amp; name)
	{
		std::shared_ptr&lt;Menu&gt; sub = Menu::Create(name, *os_);
		AddItem(sub);
		return *sub;
	}

	const std::string&amp; Name() const
	{
		return name_;
	}

	void Print() const
	{
		(*this)();
	}

private:
	void Perform() const
	{
		for(;;) 
			if (!PrintMenu()) break;
	}

	bool PrintMenu() const
	{
		*os_ &lt;&lt; &quot;\nMenu: &quot; &lt;&lt; Name() &lt;&lt; &quot;\n&quot;;
		for(size_t n = 0; n &lt; items_.size(); ++n)
			*os_ &lt;&lt; n &lt;&lt; &quot;: &quot; &lt;&lt; items_[n]-&gt;Name() &lt;&lt; &quot;\n&quot; ;
		*os_ &lt;&lt; items_.size() &lt;&lt; &quot;: Zurueck\n&quot;;
		size_t index = items_.size() + 1;
		if (!(std::cin &gt;&gt; index) || index &gt;= items_.size())
			return false;
		const MenuItem&amp; m = *items_[index]; 
		m();
		return true;
	}

private:
	std::string name_;
	std::ostream* os_;
	std::vector&lt;std::shared_ptr&lt;MenuItem&gt; &gt; items_;
};
</code></pre>
<p>Anwendung:</p>
<pre><code class="language-cpp">void MachNix()
{
	std::cout &lt;&lt; &quot;Ich mach joarnix\n&quot;;
}

class MachWas
{
public:
	void operator()() const
	{
		std::cout &lt;&lt; &quot;ich mach was\n&quot;;
	}
};

int main(int argc, char* argv[])
{
	using namespace std;

	Menu mainMenu(&quot;Hauptmenu&quot;);

        // Bsp mit lambda
	mainMenu.AddItem(MenuCommand::Create(&quot;Hallo Welt&quot;, [](){std::cout &lt;&lt; &quot;\nHallo Welt!\n&quot;;}));

        // Bsp mit Zeiger auf Funktiom
	mainMenu.AddSubMenu(&quot;Untermenu 1&quot;).AddItem(
		MenuCommand::Create(&quot;Mach nix&quot;, MachNix));

        // Bsp mit Funktionsobjekt 
	mainMenu.AddSubMenu(&quot;Untermenu 2&quot;).
		AddItem(MenuCommand::Create(&quot;Mach mal was&quot;, MachWas())).
		AddSubMenu(&quot;Untermenu 2.1&quot;).
			AddItem(MenuCommand::Create(&quot;Mach mal was&quot;, MachWas()));

	mainMenu.Print();

	return 0;
}
</code></pre>
<p>Diese verketteten Aufrufe sind Geschmackssache, man kann es natürlich auch anders machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056403</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 30 Apr 2011 10:27:23 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Programmentwurf on Sat, 30 Apr 2011 10:32:34 GMT]]></title><description><![CDATA[<p>Damit kann ich schonmal etwas anfangen,<br />
besten Dank.</p>
<p>mkG Nas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056406</guid><dc:creator><![CDATA[Nasghat]]></dc:creator><pubDate>Sat, 30 Apr 2011 10:32:34 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Programmentwurf on Sat, 30 Apr 2011 19:21:59 GMT]]></title><description><![CDATA[<p>Hat zufällig jemand eine gute Einführung zum Thema &quot;Composite Pattern&quot;. Vielleicht auch irgendwas zum Thema Design Pattern von Unis, wäre für jede Hilfe dankbar!</p>
<p>mkG Nas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056587</guid><dc:creator><![CDATA[Nasghat]]></dc:creator><pubDate>Sat, 30 Apr 2011 19:21:59 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Programmentwurf on Sat, 30 Apr 2011 19:25:42 GMT]]></title><description><![CDATA[<p>Reicht dir <a href="http://de.wikipedia.org/wiki/Entwurfsmuster" rel="nofollow">diese BEschreibung</a> als Ansatzpunkt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056589</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 30 Apr 2011 19:25:42 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Programmentwurf on Sat, 30 Apr 2011 19:59:56 GMT]]></title><description><![CDATA[<p>Das hatte ich schon vorher gefunden. Ich weiß, auch wenn es Standard sein sollte, dass viele erst Fragen und, wenn überhaupt, dann erst selber suchen. Ich gehöre nicht zu der Gruppe. Da ich noch Anfänger bin, habe ich noch keine Quelle gefunden, die es leicht verdaulich beschreibt. Aber ich gebe auch gerne zu, dass das Thema zur Zeit ein wenig ausserhalb meines Horizontes liegt <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>mkG Nas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056601</guid><dc:creator><![CDATA[Nasghat]]></dc:creator><pubDate>Sat, 30 Apr 2011 19:59:56 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Programmentwurf on Sat, 30 Apr 2011 20:21:27 GMT]]></title><description><![CDATA[<p>Hast du auch mal die dort angegebenen weiterführenden Links und Literaturhinweise ausprobiert? Das hier ist eigentlich das Standardwerk zum Thema Design Patterns:<br />
<a href="https://duckduckgo.com/?q=isbn+3827321999&amp;cppnetbooks" rel="nofollow">Entwurfsmuster | ISBN: 3827321999</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056611</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 30 Apr 2011 20:21:27 GMT</pubDate></item></channel></rss>