<?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[Programmstruktur wiederholen mit anderen Funktionen]]></title><description><![CDATA[<p>Hallo Forum</p>
<p>Hoffe ihr könnt mir helfen. <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>
<p>Ich habe eine Programmschleife, die sich in ähnlicher Form wiederholt. Dachte nun an eine Klasse, aber das Problem ist, ich ruf jedesmal andere Funktionen auf.<br />
Also im Prinzip geht es um ein Menu, dass wieder ein Untermenu öffnet etc...</p>
<pre><code class="language-cpp">//menu.h

class menu
{
public:
    menu();
    ~menu();
    void loop();
private:
    void option1();
    void option2();
    string title;
    string entry1;
    string entry2;
}

//menu.cpp
//...
void menu::loop() {
    bool exit = false;
    while( !exit ) {
        int select = 0;
        // Zeige Menuoptionen und weise select die Auswahl zu..
        //...
        switch( select ) {
            case 1:
                option1(); break;
            case 2:
                option2(); break;
            case 3:
                exit = true; break;
            default: 
                cout &lt;&lt; &quot;again please&quot; &lt;&lt; endl;
          }
    }
}

void menu::option1() {
    // Hier soll die Funktion rein zb submenu1.loop();
}
</code></pre>
<p>Wenn ich nun ein Objekt erzeuge übergeb ich ihm die strings für Titel und Einträge und starte den Loop. Aber wie kann ich nun spezifisch Funktionen aufrufen in option1() und option2() ?<br />
Muss ich das mit Vererbung machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/152690/programmstruktur-wiederholen-mit-anderen-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 09:16:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/152690.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 08 Jul 2006 17:46:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 08 Jul 2006 17:46:33 GMT]]></title><description><![CDATA[<p>Hallo Forum</p>
<p>Hoffe ihr könnt mir helfen. <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>
<p>Ich habe eine Programmschleife, die sich in ähnlicher Form wiederholt. Dachte nun an eine Klasse, aber das Problem ist, ich ruf jedesmal andere Funktionen auf.<br />
Also im Prinzip geht es um ein Menu, dass wieder ein Untermenu öffnet etc...</p>
<pre><code class="language-cpp">//menu.h

class menu
{
public:
    menu();
    ~menu();
    void loop();
private:
    void option1();
    void option2();
    string title;
    string entry1;
    string entry2;
}

//menu.cpp
//...
void menu::loop() {
    bool exit = false;
    while( !exit ) {
        int select = 0;
        // Zeige Menuoptionen und weise select die Auswahl zu..
        //...
        switch( select ) {
            case 1:
                option1(); break;
            case 2:
                option2(); break;
            case 3:
                exit = true; break;
            default: 
                cout &lt;&lt; &quot;again please&quot; &lt;&lt; endl;
          }
    }
}

void menu::option1() {
    // Hier soll die Funktion rein zb submenu1.loop();
}
</code></pre>
<p>Wenn ich nun ein Objekt erzeuge übergeb ich ihm die strings für Titel und Einträge und starte den Loop. Aber wie kann ich nun spezifisch Funktionen aufrufen in option1() und option2() ?<br />
Muss ich das mit Vererbung machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1094060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1094060</guid><dc:creator><![CDATA[Opptimist]]></dc:creator><pubDate>Sat, 08 Jul 2006 17:46:33 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 08 Jul 2006 18:23:26 GMT]]></title><description><![CDATA[<p>Wie wärs, wenn du das etwas dynamischer gestaltest?!</p>
<pre><code class="language-cpp">#include &lt;boost/function.hpp&gt; // ist nicht unbedingt nötig, aber schöner
#include &lt;map&gt;

class Menu
{
public:
    typedef boost::function0&lt;void&gt; functor_type;
    typedef std::pair&lt;std::string, functor_type&gt; option_type;
    typedef std::map&lt;int, option_type&gt; map_type;

    Menu (map_type map) : _map (map) {}
    Menu () {}
    ~Menu () {}

    void register_option (const option_type&amp; o)
    { register_option (o, _map.size () + 1); }

    void register_option (const option_type&amp; o, int i)
    { _map.insert (map_type::value_type (i, o)); }

    void operator () () const
    {
        bool done = false;
        do
        {
            // Ausgabe der Strings
            for (map_type::const_iterator i = _map.begin (), int n = 1; i != _map.end (); ++i, ++n)
                std::cout &lt;&lt; '[' &lt;&lt; i-&gt;first &lt;&lt; &quot;] &quot; &lt;&lt; i-&gt;second.first &lt;&lt; '\n';

            // Eingabe des Benutzers
            int selection;
            std::cin &gt;&gt; selection;

            if ((map_type::const_iterator i = _map.find (selection)) != _map.end ())
            {
                i-&gt;second ();
                done = true;
            }
            else
                std::cout &lt;&lt; &quot;Ungültige Eingabe&quot; &lt;&lt; std::endl;
        }
        while (!done);
    }

private:
    map_type _map;
};
</code></pre>
<p>Jetzt kannst du über register_option Strings zusammen mit Funktionen (oder auch anderen Menu-Objekten!!!) in das Menü einhängen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1094091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1094091</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 08 Jul 2006 18:23:26 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 08 Jul 2006 18:28:53 GMT]]></title><description><![CDATA[<p>Booah cool, danke für die Mühe <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="👍"
    /> <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="👍"
    /> <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 />
So hatte ich mir das vorgestellt, wusst nur nicht wie umsetzen.</p>
<p>Jetzt muss ich mir noch die boost::function0 reinziehn, sind das sowas wie Funktionszeiger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1094096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1094096</guid><dc:creator><![CDATA[Opptimist]]></dc:creator><pubDate>Sat, 08 Jul 2006 18:28:53 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 08 Jul 2006 18:35:24 GMT]]></title><description><![CDATA[<p>Ja, aber allgemeiner. <a href="http://www.boost.org/doc/html/function.html" rel="nofollow">boost::function</a> nimmt auch Funktionsobjekte (also Instanzen von Klassen mit einem operator() ) entgegen. Deshalb kannst du einfach Menu-Objekte als Untermenüs registrieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1094101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1094101</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 08 Jul 2006 18:35:24 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 08 Jul 2006 18:44:42 GMT]]></title><description><![CDATA[<p>Hey Danke!<br />
You made my day <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/1094106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1094106</guid><dc:creator><![CDATA[OPPtimist]]></dc:creator><pubDate>Sat, 08 Jul 2006 18:44:42 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 08 Jul 2006 19:00:02 GMT]]></title><description><![CDATA[<p>Wow voll der Vollprofi. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1094112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1094112</guid><dc:creator><![CDATA[neider]]></dc:creator><pubDate>Sat, 08 Jul 2006 19:00:02 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 08 Jul 2006 19:10:19 GMT]]></title><description><![CDATA[<p>Ja und ich bin voll der nOOP. Der Optimismus verfliegt schnell.<br />
Bin wohl zu blöd boost unter vs2005EE zu installieren.<br />
Ich blick bei dem Wirrwarr in der Doku nicht durch.<br />
Gibt es nicht was aus der STL das auch gehen würd?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1094122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1094122</guid><dc:creator><![CDATA[OOPtimist]]></dc:creator><pubDate>Sat, 08 Jul 2006 19:10:19 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 08 Jul 2006 20:08:17 GMT]]></title><description><![CDATA[<p>Kopier den Ordner &quot;boost&quot; aus dem Zip-Packet nach C:\Programme\Microsoft Visual Studio 8\VC\include</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1094149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1094149</guid><dc:creator><![CDATA[neider]]></dc:creator><pubDate>Sat, 08 Jul 2006 20:08:17 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 08 Jul 2006 20:24:04 GMT]]></title><description><![CDATA[<p>Und das soll alles sein?<br />
Was sollen denn die Seitenlangen beschreibungen in der Doku?</p>
<p>btw: wär boost nicht mal nen Artikel, oder mindestens nen FAQ eintrag wert?<br />
hab mit der forensuche irgendwie Nichts gescheites gefunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1094158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1094158</guid><dc:creator><![CDATA[Ooptimist]]></dc:creator><pubDate>Sat, 08 Jul 2006 20:24:04 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 08 Jul 2006 21:20:30 GMT]]></title><description><![CDATA[<p>Einige Libraries muss man kompilieren und nur das macht die Installation ein bisschen kompliziert. Für boost::function und viele andere Sachen ist das aber nicht nötig. :schland:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1094182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1094182</guid><dc:creator><![CDATA[neider]]></dc:creator><pubDate>Sat, 08 Jul 2006 21:20:30 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 15 Jul 2006 13:53:10 GMT]]></title><description><![CDATA[<p>Hi .filmor</p>
<p>Ich hab jetzt nach längerer Pause (ja es ist Sommer <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="🙂"
    /> )<br />
versucht deine Klasse umzusetzen. Echt ne tolle Sache <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 />
Funktioniert fast alles:</p>
<pre><code class="language-cpp">// Header
#include &lt;boost/function.hpp&gt;
#include &lt;map&gt;

class Menu
{
public:
	typedef boost::function0&lt;void&gt;					functor_type;
	typedef std::pair&lt;std::string, functor_type&gt;	option_type;
	typedef std::map&lt;int, option_type&gt;				map_type;
	typedef map_type::const_iterator				map_iter;

	Menu( map_type map )	: map_( map ) {}
	Menu() {}
	~Menu() {}
	void register_option( const option_type&amp; option );
	void register_option( const option_type&amp; option, int position );
	void operator() () const;
private:
	map_type map_;
};

// Implementation
// ...
void Menu::operator() () const
{
	bool done = false;
	do {
		int n = 1;
		for( map_iter it  = map_.begin(); it != map_.end(); ++it ) {
			std::cout &lt;&lt; '[' &lt;&lt; it-&gt;first &lt;&lt; &quot;] &quot; &lt;&lt; it-&gt;second.first &lt;&lt; std::endl;
			 ++n;
		}
		int selection;
		std::cin &gt;&gt; selection;
		if( ( map_iter it = map_.find( selection ) ) != map_.end() ) {
			it-&gt;second;
			done = true;
		}
		else {
			std::cout &lt;&lt; &quot;Please make a selection between 1 and &quot; 
				      &lt;&lt; n - 1 &lt;&lt; std::endl;
		}
	} while( !done );
}
</code></pre>
<p>aber bei der Zeile</p>
<pre><code class="language-cpp">if( ( map_iter it = map_.find( selection ) ) != map_.end() )
</code></pre>
<p>motzt der Compiler.</p>
<blockquote>
<p>c:\..menu.cpp(28) : error C2146: syntax error : missing ')' before identifier 'it'<br />
c:\..menu.cpp(28) : error C2065: 'it' : undeclared identifier<br />
c:\..menu.cpp(28) : error C2143: syntax error : missing ';' before '!='<br />
c:\..menu.cpp(28) : warning C4390: ';' : empty controlled statement found; is this the intent?<br />
c:\..menu.cpp(28) : error C2059: syntax error : ')'<br />
c:\..menu.cpp(28) : error C2143: syntax error : missing ';' before '{'</p>
</blockquote>
<p>Ich kann aber nicht finden wo mein Fehler ist, hab die Zeile aus deinem Beispiel übernommen. Da fehlt doch auch keine Klammer oder?</p>
<p>Ne andere Frage wäre, wofür du das int n brauchst in der for Schlaufe:</p>
<pre><code class="language-cpp">for (map_type::const_iterator i = _map.begin (), int n = 1; i != _map.end (); ++i, ++n)
                std::cout &lt;&lt; '[' &lt;&lt; i-&gt;first &lt;&lt; &quot;] &quot; &lt;&lt; i-&gt;second.first &lt;&lt; '\n';
</code></pre>
<p>Danke dann auch schonmal im voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1098222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1098222</guid><dc:creator><![CDATA[Opptimist]]></dc:creator><pubDate>Sat, 15 Jul 2006 13:53:10 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 15 Jul 2006 14:00:03 GMT]]></title><description><![CDATA[<p>Seltsamerweise geht es, wenn ich den Iterator vorher deklariere:</p>
<pre><code class="language-cpp">map_iter it;
    if( ( it = map_.find( selection ) ) != map_.end() ) { ...
</code></pre>
<p>any ideas <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="😕"
    /> <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="😕"
    /> <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>
<p>Übrigens, um die Funktion aufzurufen, müsste es dann auch so heissen:</p>
<pre><code class="language-cpp">if( ( it = map_.find( selection ) ) != map_.end() ) {
			it-&gt;second.second();  // &lt;-- !!!			done = true;
		}
</code></pre>
<p>it-&gt;second wäre ja der option_type<br />
it-&gt;second.second ist erst der Functor, und den Operator() brauchts ja auch noch <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/1098228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1098228</guid><dc:creator><![CDATA[Opptimist]]></dc:creator><pubDate>Sat, 15 Jul 2006 14:00:03 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 15 Jul 2006 15:19:44 GMT]]></title><description><![CDATA[<p>Sorry, wenn ich hier weiter frage, aber will nicht nen neuen Thread aufmachen, gehört ja eigentlich dazu.</p>
<p>Ich hab nun also meine tolle dynamische Klasse &quot;Menu&quot; (c) .filmor <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 />
Registriere zum testen in der Main() die Menus &quot;zu Fuss&quot;, klappt alles wunderbar. Hab noch die Option 0 für exit reingebaut, die die Do While Schlaufe beendet, damit man nach ausführen der Option wieder zum Menu zurückkommt.</p>
<p>Menu.cpp (ausschnitt)</p>
<pre><code class="language-cpp">void Menu::operator() () const
{
	bool done = false;
	do {
		std::cout &lt;&lt; endl &lt;&lt; title_ &lt;&lt; std::endl &lt;&lt; std::endl;
		int n = 1;
		for( map_iter it  = map_.begin(); 
					  it != map_.end(); ++it ) {
			std::cout &lt;&lt; '[' &lt;&lt; it-&gt;first &lt;&lt; &quot;] &quot; &lt;&lt; it-&gt;second.first 
				      &lt;&lt; std::endl;
			 ++n;
		}
		std::cout &lt;&lt; std::endl 
			      &lt;&lt; &quot;[0] Exit&quot; 
				  &lt;&lt; std::endl;
		int selection;
		std::cin &gt;&gt; selection;
		map_iter it;
		if( ( it = map_.find( selection ) ) != map_.end() ) {
			it-&gt;second.second();
		}
		else if( selection == 0 ) {
			done = true;
		}
		else {
			std::cout &lt;&lt; &quot;Please make a selection between 0 and &quot; &lt;&lt; n - 1 
				      &lt;&lt; std::endl;
		}
	} while( !done );
}
</code></pre>
<p>Main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;conio.h&gt;
#include &quot;Defs.h&quot;
#include &quot;Menu.h&quot;
#include &quot;Menustructure.h&quot;

using namespace std;

typedef boost::function0&lt;void&gt;		functor_type;
typedef pair&lt;string, functor_type&gt;	option_type;

void option1_function()
{
	cout &lt;&lt; &quot;option1&quot; &lt;&lt; endl;
}

void option2_function()
{
	cout &lt;&lt; &quot;option2&quot; &lt;&lt; endl;
}

void sub1_option1_function()
{
	cout &lt;&lt; &quot;sub1_option1&quot; &lt;&lt; endl;
}

void sub1_option2_function()
{
	cout &lt;&lt; &quot;sub1_option2&quot; &lt;&lt; endl;
}

int main()
{
	cout &lt;&lt; &quot;Welcome to the Game Test&quot; &lt;&lt; endl
		 &lt;&lt; &quot;Hit enter to enter main menu&quot; &lt;&lt; endl
		 &lt;&lt; endl;
    cin.get();
// Erstelle Menus und registriere Optionen
	Menu sub1_menu( &quot; Sub1 Menu&quot; );
	option_type sub1_option1( &quot;Sub1 Option1&quot;, sub1_option1_function );
	option_type sub1_option2( &quot;Sub1 Option2&quot;, sub1_option2_function );
	sub1_menu.register_option( sub1_option1 );
	sub1_menu.register_option( sub1_option2 );
	Menu main_menu( &quot;Main Menu&quot; );
	option_type option1( &quot;Sub1 Menu&quot;, sub1_menu );
	option_type option2( &quot;Option2&quot;, option2_function );
	main_menu.register_option( option1 );
	main_menu.register_option( option2 );
	main_menu();
//------------------------------------------------------
	cout &lt;&lt; endl
		 &lt;&lt; &quot;Hit enter to close window&quot; &lt;&lt; endl;
	cin.clear();
	cin.ignore( cin.rdbuf()-&gt;in_avail() );
    cin.get();
	return 0;
}
</code></pre>
<p>Da ich gerne möglichst sauberes und wiederverwendbares OOP lernen will, und sowenig wie möglich in der Main() haben möchte, wollt ich die ganze Menuhierarchie auslagern. Ich dachte an eine statische Klasse. Hab ich andere Möglichkeiten, als alles im Source hard zu codieren? Ich dachte dabei auch an structs mit Titel, den Optionen und Funktionen. Nur ändert ja die Anzahl der Optionen jeweils. Mach ich einfach ne Struktur für jedes Submenu, oder mach ich ne Map (map_type) die ich dann befülle?</p>
<p>Sorry ich hoff das ist jetzt nicht unverständlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1098256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1098256</guid><dc:creator><![CDATA[Opptimist]]></dc:creator><pubDate>Sat, 15 Jul 2006 15:19:44 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sat, 15 Jul 2006 17:44:55 GMT]]></title><description><![CDATA[<p>Opptimist schrieb:</p>
<blockquote>
<p>aber bei der Zeile</p>
<pre><code class="language-cpp">if( ( map_iter it = map_.find( selection ) ) != map_.end() )
</code></pre>
<p>motzt der Compiler. Ich kann aber nicht finden wo mein Fehler ist, hab die Zeile aus deinem Beispiel übernommen.</p>
</blockquote>
<p>Opptimist schrieb:</p>
<blockquote>
<p>Seltsamerweise geht es, wenn ich den Iterator vorher deklariere:</p>
<pre><code class="language-cpp">map_iter it;
    if( ( it = map_.find( selection ) ) != map_.end() ) { ...
</code></pre>
<p>any ideas <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="😕"
    /> <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="😕"
    /> <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>Das liegt daran, dass dein Compiler (VC6?) die erste Syntax wohl nicht unterstützt. Ich hab den Code nicht getestet, es macht aber nichts, wenn du den Iterator darüber erzeugst, die Zuweisung kannst du dir aber trotzdem sparen:</p>
<pre><code class="language-cpp">map_iter it = map_.find( selection );
    if( it != map_.end() ) ...
</code></pre>
<p>Konstruktoraufrufe (und genau das ist das erste!) sind günstiger als Zuweisungen.</p>
<p>Opptimist schrieb:</p>
<blockquote>
<p>Übrigens, um die Funktion aufzurufen, müsste es dann auch so heissen:</p>
<pre><code class="language-cpp">if( ( it = map_.find( selection ) ) != map_.end() ) {
			it-&gt;second.second();  // &lt;-- !!!			done = true;
		}
</code></pre>
<p>it-&gt;second wäre ja der option_type<br />
it-&gt;second.second ist erst der Functor, und den Operator() brauchts ja auch noch <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>
</blockquote>
<p>Alles ungetesteter Code... <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>
<p>Opptimist schrieb:</p>
<blockquote>
<p>Ne andere Frage wäre, wofür du das int n brauchst in der for Schlaufe:</p>
<pre><code class="language-cpp">for (map_type::const_iterator i = _map.begin (), int n = 1; i != _map.end (); ++i, ++n)
                std::cout &lt;&lt; '[' &lt;&lt; i-&gt;first &lt;&lt; &quot;] &quot; &lt;&lt; i-&gt;second.first &lt;&lt; '\n';
</code></pre>
</blockquote>
<p>Das ist ein &quot;Überbleibsel&quot; aus der ersten Art, wie ich die Nummerierung gehandhabt habe. Ich bin aber zur Überzeugung gekommen, dass die jetzige Art besser ist. Dieser Teil sollte (mit deiner Nomenklatur) so aussehen:</p>
<pre><code class="language-cpp">for (map_type::const_iterator i = map_.begin (); i != map_.end (); ++i)
    std::cout &lt;&lt; '[' &lt;&lt; i-&gt;first &lt;&lt; &quot;] &quot; &lt;&lt; i-&gt;second.first &lt;&lt; '\n';
</code></pre>
<p>Opptimist schrieb:</p>
<blockquote>
<p>Da ich gerne möglichst sauberes und wiederverwendbares OOP lernen will, und sowenig wie möglich in der Main() haben möchte, wollt ich die ganze Menuhierarchie auslagern.</p>
</blockquote>
<p>Lobenswert, aber Menüstrukturen sind eigentlich ziemlich &quot;programmabhängig&quot;, also schwer wiederzuverwenden. Wenn es allgemeine Aufgabe sind, kannst du dafür ja einfach Klassen erstellen, deren Objekte im Konstruktor irgendwelchen spezifischen Krams entgegennehmen.</p>
<p>Opptimist schrieb:</p>
<blockquote>
<p>Ich dachte an eine statische Klasse.</p>
</blockquote>
<p>So etwas (bzw. das Gegenteil) gibt es nicht! Alle Klassen sind &quot;statisch&quot;, denn C++ ist eine statisch typisierte Sprache.</p>
<p>Opptimist schrieb:</p>
<blockquote>
<p>Hab ich andere Möglichkeiten, als alles im Source hard zu codieren?</p>
</blockquote>
<p>Ja, siehe oben. Du kannst auch die Menüstrukturen aus einer Datei parsen, die dann auszuführende Funktion ist aber so schwer zu beschreiben. Für &quot;vorgefertigte&quot; Objekte wie oben erwähnt ist das aber durchaus gangbar.</p>
<p>Opptimist schrieb:</p>
<blockquote>
<p>Ich dachte dabei auch an structs mit Titel, den Optionen und Funktionen. Nur ändert ja die Anzahl der Optionen jeweils. Mach ich einfach ne Struktur für jedes Submenu, oder mach ich ne Map (map_type) die ich dann befülle?</p>
<p>Sorry ich hoff das ist jetzt nicht unverständlich.</p>
</blockquote>
<p>Leider nicht, ich habs zumindest nicht verstanden :(.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1098305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1098305</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 15 Jul 2006 17:44:55 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Sun, 16 Jul 2006 12:42:04 GMT]]></title><description><![CDATA[<p>Danke. Schon klar, dass de nicht getestet hast. Wollt nur drauf Hinweisen, falls andere Anfänger auch drüber stolpern :p<br />
Und sorry fürs Verwirren. Ev. mach ichs auch viel zu kompliziert. Also ich hab jetzt was halbweg brauchbares. Wenigstens ist die main() wieder schlanker <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>
<p>Also erst mal hab ich ne Struct gemacht, und nen weiteren Ctor für die Menu Klasse:</p>
<pre><code class="language-cpp">Menu::Menu( Menustructure&amp; menu )
	: title_( menu.title ), map_( menu.options )
{}

Menu::Menu( std::string title, map_type map ) 
	: title_( title ),  map_( map ) 
{}

Menu::Menu( std::string title ) 
	: title_( title )
{}
</code></pre>
<p>Menustructure.h</p>
<pre><code class="language-cpp">struct Menustructure
{
	std::string	title;
	map_type	options;
};

extern Menu main_menu;
</code></pre>
<p>Menustructure.cpp<br />
Hier ist dann die Festlegung der Menus, also die einzige Stelle wo man ändern muss, für neue Menuhierarchie</p>
<pre><code class="language-cpp">#include &lt;boost/assign/list_of.hpp&gt;
#include &lt;iostream&gt;

// ---- Sub1 Menu -------------------------------------------------------------
void sub1_option1_function()
{
	std::cout &lt;&lt; std::endl &lt;&lt; &quot;sub1_option1&quot; &lt;&lt; std::endl &lt;&lt; std::endl;
}

void sub1_option2_function()
{
	std::cout &lt;&lt; std::endl &lt;&lt; &quot;sub1_option2&quot; &lt;&lt; std::endl &lt;&lt; std::endl;
}

option_type sub1_option1( &quot;Sub1 Option1&quot;, sub1_option1_function );
option_type sub1_option2( &quot;Sub1 Option2&quot;, sub1_option2_function );

Menustructure sub1_menu_structure = {
	&quot;Sub1 Menu &quot;,
	boost::assign::map_list_of( 1, sub1_option1 )( 2, sub1_option2 )
};

Menu sub1_menu( sub1_menu_structure );

// ---- Main Menu -------------------------------------------------------------
void option2_function()
{
	std::cout &lt;&lt; std::endl &lt;&lt; &quot;option2&quot; &lt;&lt; std::endl &lt;&lt; std::endl;
}

option_type option1( &quot;Sub1 Menu&quot;, sub1_menu );
option_type option2( &quot;Option2&quot;, option2_function );

Menustructure main_menu_struct = {
	&quot;Main Menu &quot;,
	boost::assign::map_list_of( 1, option1 )( 2, option2 )
};

Menu main_menu( main_menu_struct );
</code></pre>
<p>Kann man ev. noch schöner lösen, über Kritiken würd ich mich freuen. Mir gefällt irgendwie nicht, das alle Funktionen und Menuobjekte global sind.</p>
<p>Aber in der main() reicht nun ein einfacher Aufruf um die ganze Hierarchie zu starten:</p>
<pre><code class="language-cpp">int main()
{
	cout &lt;&lt; &quot;Welcome to the Game Test&quot; &lt;&lt; endl
		 &lt;&lt; &quot;Hit enter to enter main menu&quot; &lt;&lt; endl
		 &lt;&lt; line &lt;&lt; endl;
    cin.get();

	main_menu();

	cout &lt;&lt; line &lt;&lt; endl
		 &lt;&lt; &quot;Hit enter to close window&quot; &lt;&lt; endl;
	cin.clear();
	cin.ignore( cin.rdbuf()-&gt;in_avail() );
    cin.get();
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1098549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1098549</guid><dc:creator><![CDATA[Opptimist]]></dc:creator><pubDate>Sun, 16 Jul 2006 12:42:04 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Mon, 17 Jul 2006 09:36:37 GMT]]></title><description><![CDATA[<p>Du kannst die Funktionen und Objekte doch einfach in eine Klasse (bzw. einen Namespace) packen. Wenn du die Funktionen in eine Klasse packst, so solltest du die Funktionen dann statisch deklarieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1099013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1099013</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 17 Jul 2006 09:36:37 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Mon, 17 Jul 2006 15:26:02 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>Du kannst die Funktionen und Objekte doch einfach in eine Klasse (bzw. einen Namespace) packen. Wenn du die Funktionen in eine Klasse packst, so solltest du die Funktionen dann statisch deklarieren.</p>
</blockquote>
<p>Ja an ne Klasse dachte ich auch. Warum statisch?<br />
Sollte dann wohl nur ein Objekt der Klasse erzeugen oder? Etwa ein Singleton?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1099278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1099278</guid><dc:creator><![CDATA[OOPtimist]]></dc:creator><pubDate>Mon, 17 Jul 2006 15:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Mon, 17 Jul 2006 15:30:37 GMT]]></title><description><![CDATA[<p>Statisch, damit du eben kein Objekt erzeugen musst. Statische Methoden gehören der Klasse, sind also mehr oder weniger normale Funktionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1099279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1099279</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 17 Jul 2006 15:30:37 GMT</pubDate></item><item><title><![CDATA[Reply to Programmstruktur wiederholen mit anderen Funktionen on Mon, 17 Jul 2006 15:38:42 GMT]]></title><description><![CDATA[<p>Ah ok, geschnallt, danke.<br />
Dann kann ich die Optionen (also die Funktionen, auf die die Funktoren zeigen) im private Bereich verstecken. Werd mich gleich mal dransetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1099282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1099282</guid><dc:creator><![CDATA[Ooptimist]]></dc:creator><pubDate>Mon, 17 Jul 2006 15:38:42 GMT</pubDate></item></channel></rss>