<?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[Functionpointer in Konstruktor zuweisen]]></title><description><![CDATA[<p>HI,<br />
ich hoffe ihr könnt mir helfen, ich habe ein Problem mit Funktionszeigern.<br />
Ich benutze sie gerade das erste Mal und renne in ein Problem.</p>
<p>Mein Programm soll einige Dateien Parsen und dabei für gewisse Dateien bestimmte Parsing Funktionen benutzen.</p>
<p>Ich wollte also an die read_file Funktion den Filepath und den richtigen Functionpointer übergeben.</p>
<p>Ich bekomme allerdings wenn ich im Konstruktor der Klasse den Funktionspointer zuweisen will beim kompilieren einen Fehler:</p>
<p>error C2276: '&amp;': Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion</p>
<p>HIer das Beispiel:</p>
<p>Mgr.hpp</p>
<pre><code>class Mgr {

public:
Mgr();

void parse_template_keys(std::string &amp; tmp, std::string &amp; caption, std::string &amp; action);

void(Mgr::*parse_templ_k_ptr)(std::string &amp;, std::string &amp;, std::string &amp;);
};
</code></pre>
<p>Mgr.cpp</p>
<pre><code>Mgr::Mgr() {
    parse_templ_k_ptr = &amp;parse_template_keys;
}
</code></pre>
<p>Ich hoffe ihr könnt mir helfen.</p>
<p>Gruß<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326868/functionpointer-in-konstruktor-zuweisen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 26 May 2026 13:55:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326868.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Jul 2014 19:49:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Functionpointer in Konstruktor zuweisen on Thu, 10 Jul 2014 19:49:47 GMT]]></title><description><![CDATA[<p>HI,<br />
ich hoffe ihr könnt mir helfen, ich habe ein Problem mit Funktionszeigern.<br />
Ich benutze sie gerade das erste Mal und renne in ein Problem.</p>
<p>Mein Programm soll einige Dateien Parsen und dabei für gewisse Dateien bestimmte Parsing Funktionen benutzen.</p>
<p>Ich wollte also an die read_file Funktion den Filepath und den richtigen Functionpointer übergeben.</p>
<p>Ich bekomme allerdings wenn ich im Konstruktor der Klasse den Funktionspointer zuweisen will beim kompilieren einen Fehler:</p>
<p>error C2276: '&amp;': Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion</p>
<p>HIer das Beispiel:</p>
<p>Mgr.hpp</p>
<pre><code>class Mgr {

public:
Mgr();

void parse_template_keys(std::string &amp; tmp, std::string &amp; caption, std::string &amp; action);

void(Mgr::*parse_templ_k_ptr)(std::string &amp;, std::string &amp;, std::string &amp;);
};
</code></pre>
<p>Mgr.cpp</p>
<pre><code>Mgr::Mgr() {
    parse_templ_k_ptr = &amp;parse_template_keys;
}
</code></pre>
<p>Ich hoffe ihr könnt mir helfen.</p>
<p>Gruß<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408091</guid><dc:creator><![CDATA[Chp++]]></dc:creator><pubDate>Thu, 10 Jul 2014 19:49:47 GMT</pubDate></item><item><title><![CDATA[Reply to Functionpointer in Konstruktor zuweisen on Thu, 10 Jul 2014 20:06:18 GMT]]></title><description><![CDATA[<p>Chp++ schrieb:</p>
<blockquote>
<p>Ich wollte also an die read_file Funktion den Filepath und den richtigen Functionpointer übergeben.</p>
</blockquote>
<p>Memberfunktionszeiger sind keine Zeiger.</p>
<p>Chp++ schrieb:</p>
<blockquote>
<p>Ich bekomme allerdings wenn ich im Konstruktor der Klasse den Funktionspointer zuweisen will beim kompilieren einen Fehler:</p>
<p>error C2276: '&amp;': Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion</p>
<pre><code>Mgr::Mgr() {
    parse_templ_k_ptr = &amp;parse_template_keys;
}
</code></pre>
</blockquote>
<p>Um Zeiger auf Member zu erzeugen, ist immer ein qualifizierter Bezeichner erforderlich:</p>
<pre><code class="language-cpp">Mgr::Mgr()
  : parse_templ_k_ptr( &amp;Mgr::parse_template_keys )
{}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2408095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408095</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 10 Jul 2014 20:06:18 GMT</pubDate></item><item><title><![CDATA[Reply to Functionpointer in Konstruktor zuweisen on Thu, 10 Jul 2014 20:07:12 GMT]]></title><description><![CDATA[<p><code>parse_template_keys</code> musst du auch irgendwo definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408096</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Thu, 10 Jul 2014 20:07:12 GMT</pubDate></item><item><title><![CDATA[Reply to Functionpointer in Konstruktor zuweisen on Thu, 10 Jul 2014 20:08:28 GMT]]></title><description><![CDATA[<p>Problembehebung:</p>
<pre><code>parse_templ_k_ptr = &amp;Mgr::parse_template_keys;
</code></pre>
<p>Allgemeine Frage: Weißt du wirklich, was du da tust? Und sind Funktionszeiger das richtige Mittel für dein Problem? Dein Problem ist leider nicht genau genug spezifiziert, daher kann ich das nicht genau sagen. Was ich jedoch bemerke ist, dass es sehr ungewöhnlich ist, einen Dateinamen an eine Lesefunktion zu übergeben (warum sollte sich eine Lesefunktion um Dateien kümmern?), daher bin ich auch stutzig gegenüber den Funktionszeigern. Die sind ein von Anfängern oft missbrauchtes Mittel. (Das heißt nicht, dass es falsch ist. Deshalb frage ich ja, ob du dir wirklich sicher bist.)</p>
<p>edit: Da war camper schneller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408097</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 10 Jul 2014 20:08:28 GMT</pubDate></item><item><title><![CDATA[Reply to Functionpointer in Konstruktor zuweisen on Thu, 10 Jul 2014 20:49:18 GMT]]></title><description><![CDATA[<p>EDIT: Entschuldigt die grässliche Formatierung.<br />
Habe mich jetzt angemeldet hier nochmal in schöner.</p>
<p>Danke an alle.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3822">@Sepp</a><br />
Ich habe mich glaube ich unglücklich ausgedrückt. Um sicherzugehen, dass ich nichts grundlegend Falsch mache hier nochmal genauer.</p>
<p>Ich möchte mehrere Dateien auslesen.<br />
Die Dateien stammen nicht von mir und ich kann sie auch leider nicht ändern.</p>
<p>In den ersten Dateien möchte ich Keys, die mit einer gewissen Syntax, in der Textdatei markiert sind auslesen und speichern. Dafür habe ich eine Parsing-Funktion geschrieben. Ich nenne sie mal Alpha.</p>
<p>Als nächsten Schritt lese ich weitere Dateien ein in der die Keys leider eine andere Syntax haben. Dafür habe ich eine weitere Parsing Funktion geschrieben. Beta.</p>
<p>Danach verarbeite ich die gesammelten Daten.<br />
Ich habe das so implementiert:</p>
<p>Ich habe eine Member Funktion die die Dateien mit ifstream öffnet und mit getline die Zeile in einen String speichert.<br />
Ich übergebe dieser Funktion ein Fileobjekt ,dass den Filepath enthält sowie einen Funktionszeiger zur passenden Parsing Funktion.<br />
Nachdem getline die Zeile in den String gespeichert hat rufe ich den Funktionspointer auf um den eingesammelten String zu parsen/analysieren.</p>
<p>Das Hauptproblem ist, dass ich durch das Lesen der Datei nicht erkennen kann welche Funktion ich aufrufen muss.<br />
Die Syntax der Schlüsselwörter unterscheidet sich in einer Art und Weise, dass ich bei dem Versuch eine Parsing Funktion für alle zu schreiben gescheitert bin.<br />
Auch mein Versuch eine Funktion zu schreiben die automatisch erkennt welche Lesefunktion ich aufrufen muss hat nicht funktioniert.</p>
<p>D.h. bevor ich lese muss ich wissen welche Parsing-Funktion die richtige Funktion ist.<br />
Ich weiß leider nicht, wie ich es anders hätte machen können, ohne eine weitere Lese-Funktion zu schreiben und einen weiteren vector zu implementieren für die zweite Sorte von Dateien.</p>
<p>Ich dachte eine generische Lesefunktion wäre die beste Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408106</guid><dc:creator><![CDATA[chp++]]></dc:creator><pubDate>Thu, 10 Jul 2014 20:49:18 GMT</pubDate></item><item><title><![CDATA[Reply to Functionpointer in Konstruktor zuweisen on Thu, 10 Jul 2014 21:18:19 GMT]]></title><description><![CDATA[<p>chp++ schrieb:</p>
<blockquote>
<p>Das Hauptproblem ist, dass ich durch das Lesen der Datei nicht erkennen kann welche Funktion ich aufrufen muss.</p>
</blockquote>
<p>Und wie findest du es letztendlich heraus?</p>
<blockquote>
<p>Die Syntax der Schlüsselwörter unterscheidet sich in einer Art und Weise, dass ich bei dem Versuch eine Parsing Funktion für alle zu schreiben gescheitert bin.</p>
</blockquote>
<p>Vielleicht kommen wir auf eine Lösung. Zeig mal die beiden Formate.</p>
<blockquote>
<p>Ich habe eine Member Funktion die die Dateien mit ifstream öffnet und mit getline die Zeile in einen String speichert.<br />
Ich übergebe dieser Funktion ein Fileobjekt ,dass den Filepath enthält sowie einen Funktionszeiger zur passenden Parsing Funktion.<br />
Nachdem getline die Zeile in den String gespeichert hat rufe ich den Funktionspointer auf um den eingesammelten String zu parsen/analysieren.</p>
</blockquote>
<p>Das klingt umständlich und hat die schon genannten Probleme. Warum öffnet eine Lesefunktion eine Datei? Warum die Daten zwischenspeichern, anstatt direkt parsen?</p>
<blockquote>
<p>Ich dachte eine generische Lesefunktion wäre die beste Lösung.</p>
</blockquote>
<p>Was macht denn diese generische Lesefunktion überhaupt noch? Das klingt so als hättest du eine Funktion um den typischen C++-Lese-Dreizeiler geschrieben, um dann mit viel Code und Aufwand diesen nicht ausschreiben zu brauchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408111</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 10 Jul 2014 21:18:19 GMT</pubDate></item><item><title><![CDATA[Reply to Functionpointer in Konstruktor zuweisen on Fri, 11 Jul 2014 10:20:02 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Und wie findest du es letztendlich heraus?</p>
</blockquote>
<p>Gar nicht. Ich hatte es beim erstellen des Vectors der die Filepaths zum öffnen enthält fest verdrahtet.</p>
<p>Allerdings sieht man manchmal den Wald vor lauter Bäumen nicht mehr.<br />
Ich kann anhand der Syntax des Filenamens erkennen welche Funktion ich aufrufen muss.<br />
Die Sache mit den Funktionspointern kann ich mir also sparen.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Vielleicht kommen wir auf eine Lösung. Zeig mal die beiden Formate.</p>
</blockquote>
<p>Gerne, aber ich würde erstmal am Wochenende (im ausgeschlafen Zustand) doch noch einmal einen Versuch starten, wenn es dann nicht klappt komme ich auf das Angebot zurück. <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>SeppJ schrieb:</p>
<blockquote>
<p>Das klingt umständlich und hat die schon genannten Probleme. Warum öffnet eine Lesefunktion eine Datei? Warum die Daten zwischenspeichern, anstatt direkt parsen?</p>
</blockquote>
<p>Das versteh ich nicht so ganz.<br />
Welche Funktion soll denn sonst die Datei öffnen?</p>
<p>Also bei mir würde das mit den Änderungen irgendwie so ausehen.:</p>
<pre><code>bool load_action_keys (string &amp; filepath)
{
	//analyse filename to know which parse function I need and set char with
	// corresponding value
	char parse_mode = filename_parse_result(filepath);

	// open file
	ifstream input(filepath);

	if (!input.is_open());
		return false;

	string tmp;
	tmp.reserve(40);

	while(input.good()
	{
		getline(input, tmp);

		switch (char_parse_mode)
		{
			case 'A': { parse_func_alpha(tmp); } break;
			case 'B': { parse_func_beta(tmp); } break;
		}
	}
}
// Edit durch Arcoth: Formatiert. Künftig bitte selber machen!
</code></pre>
<p>Oder wie würdet ihr das machen?<br />
Ich habe File I/O noch nicht so oft gemacht.<br />
Ich habe im Moment keinen Compiler zur Hand ich hoffe ich habe es richtig geschrieben.<br />
Du meinst, dass ich gleich char für char auslesen und analysieren soll?<br />
Getline schien mir irgendwie auf den ersten Blick als naheliegende Wahl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408157</guid><dc:creator><![CDATA[chp++]]></dc:creator><pubDate>Fri, 11 Jul 2014 10:20:02 GMT</pubDate></item><item><title><![CDATA[Reply to Functionpointer in Konstruktor zuweisen on Fri, 11 Jul 2014 17:22:57 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich kann anhand der Syntax des Filenamens erkennen welche Funktion ich aufrufen muss.<br />
Die Sache mit den Funktionspointern kann ich mir also sparen.</p>
</blockquote>
<p>Ich muss zugeben, dass ich das schon erwartet hatte und die Fragen bewusst so gestellt habe, dass du darauf kommst.</p>
<blockquote>
<p>Welche Funktion soll denn sonst die Datei öffnen?</p>
</blockquote>
<p>Normalerweise arbeiten Lesefunktionen ganz abstrakt auf Streams. Was kümmert es einen Parser, wo die Daten herkommen. Derjenige, der sich darum kümmert, ist doch derjenige, der auch den Parser aufruft.<br />
Also</p>
<pre><code>Datenobjekt data;
ifstream file(&quot;foo.bar&quot;);
read_data(file, data);
</code></pre>
<p>oder, wenn man den Namen der Funktion etwas geschickter wählt:</p>
<pre><code>Datenobjekt data;
ifstream file(&quot;foo.bar&quot;);
file &gt;&gt; data;
</code></pre>
<p>Diese Schreibweise dürfte dir bekannt vorkommen, oder?</p>
<blockquote>
<p>Ich habe File I/O noch nicht so oft gemacht.</p>
</blockquote>
<p>Man merkt's. Aber wie oben erwähnt ist es für eine LEsefunktion eigentlich egal, woher die Daten kommen. Deine Schleife funktioniert jedoch in gar keinem Fall richtig: Zuerst prüfst du auf Fehler, dann liest du, dann verarbeitest du ungeprüft das Ergebnis. Falsche Reihenfolge, findest du nicht? Sollte wohl eher Lesen, Prüfen auf Erfolg, Verarbeiten sein. So oder ähnlich sehen Leseschleifen in C++<sup>*</sup> aus:</p>
<pre><code>while(lesen(daten))
  verarbeite(daten);
</code></pre>
<blockquote>
<p>Du meinst, dass ich gleich char für char auslesen und analysieren soll?</p>
</blockquote>
<p>Nicht direkt. Kommt drauf an. Was machen deine Parsefunktionen denn? Die packen den String doch sicherlich direkt wieder in einen Stringstream und du liest dann aus diesem. Warum dann nicht direkt aus der Originalquelle lesen?</p>
<p><sup>*</sup>: Und in allen anderen C-artigen Sprachen. Wenn du deine Art und Weise aus irgendeinem Buch oder Tutorial hast, dann ist das ein sehr guter Grund, diese Quelle in Zukunft nie wieder zu nutzen und alles zu vergessen, was darin steht. Der Autor hat keine Ahnung. Kommt leider oft vor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408239</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 11 Jul 2014 17:22:57 GMT</pubDate></item><item><title><![CDATA[Reply to Functionpointer in Konstruktor zuweisen on Fri, 11 Jul 2014 18:39:30 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Man merkt's. Aber wie oben erwähnt ist es für eine LEsefunktion eigentlich egal, woher die Daten kommen. Deine Schleife funktioniert jedoch in gar keinem Fall richtig: Zuerst prüfst du auf Fehler, dann liest du, dann verarbeitest du ungeprüft das Ergebnis. Falsche Reihenfolge, findest du nicht? Sollte wohl eher Lesen, Prüfen auf Erfolg, Verarbeiten sein. So oder ähnlich sehen Leseschleifen in C++<sup>*</sup> aus:</p>
<pre><code>while(lesen(daten))
  verarbeite(daten);
</code></pre>
</blockquote>
<p>Entschuldige das habe ich nicht ganz verstanden.<br />
Ich habe den Part mal angepasst so wie ich das verstanden habe?</p>
<pre><code>ifstream input(filepath);

    if (!input.is_open()) 
        return false;

    while (getline(input,tmp))
    {
        switch (parse_mode)
        {
        case 'A': { parse_func_alpha(tmp); } break;
        case 'B': { parse_func_beta(tmp); } break;
        }

    }
</code></pre>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Nicht direkt. Kommt drauf an. Was machen deine Parsefunktionen denn? Die packen den String doch sicherlich direkt wieder in einen Stringstream und du liest dann aus diesem. Warum dann nicht direkt aus der Originalquelle lesen?</p>
</blockquote>
<p>Mir ist gerade nicht ganz klar was du damit meinst.<br />
Meine Parsing-Funktion sieht so aus. (Ich hoffe es ist nicht zuviel Code zum pasten.)<br />
Ich suche in der Datei eine Action und die dazugehörige Caption.<br />
Jede Caption hat ein ?@{caption} am Anfang allerdings können mehrere Captions hintereinander vorkommen UND die Caption geht über den Key hinaus.</p>
<p>bsp. Caption: ?@{Caption} = blabla blubblub</p>
<p>Mich interessiert auch nur die Caption direkt über einer Action die Syntax einer Action ist leider nicht unique @{key.blabla.bla}.<br />
Es gibt auch @{junk} der genauso aussieht wie eine Action.<br />
Glücklicherweise fangen alle Actions mit &quot;key&quot; an.</p>
<p>Wenn ich die Action und die dazugehörige Caption habe baue ich ein Action-Objekt.<br />
Wenn ich etwas besser machen kann dann bitte sagen.</p>
<pre><code>void Mgr::parse_template_keys(string &amp; tmp, string &amp; caption, string &amp; action) {
    string::const_iterator it;
    string::const_iterator it_begin;
    string::const_iterator it_end;

    // U = unknown; C = caption, A = action
    char switch_value = 'U';
    bool in_key = false;

    //was ist es??
    for (it = tmp.begin(); it != tmp.end(); ++it){
        if (*it == '?') {
            switch_value = 'C';
            break;
        }
        if (*it == '@') {

            if (tmp.find(&quot;key&quot;) != string::npos)
            {
                switch_value = 'A';
                break;
            }
        }
    }
    //weiche zum entsprechenden parsing code
    switch (switch_value) {
        // caption
    case ('C') : {
                     for (it = tmp.begin(); it != tmp.end(); ++it) {

                         if (*it == '@')
                             it_begin = it;

                         if (*it &gt;= 65 &amp;&amp; *it &lt;= 90)
                             it_end = it + 1;

                     }
                     string temp_copy(it_begin, it_end);
                     caption = std::move(temp_copy);
    }    break;

                     //action
    case ('A') : {
                     for (it = tmp.begin(); it != tmp.end(); ++it) {

                         if (in_key == true) {
                             it_begin = it;
                             in_key = false;
                         }
                         if (*it == '{')
                             in_key = true;

                         if (*it == '}') {
                             it_end = it;
                             break;
                         }
                     }
                     string temp_copy(it_begin, it_end);
                     action = std::move(temp_copy);
    }break;

    default: { tmp.clear(); }

    }

        if (action.empty() == false) {
            action_list.push_back(unique_ptr&lt;Action&gt;(new Action(std::move(caption), std::move(action))));
            action.clear();
        }
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2408248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408248</guid><dc:creator><![CDATA[chp++]]></dc:creator><pubDate>Fri, 11 Jul 2014 18:39:30 GMT</pubDate></item><item><title><![CDATA[Reply to Functionpointer in Konstruktor zuweisen on Fri, 11 Jul 2014 19:32:24 GMT]]></title><description><![CDATA[<p>chp++ schrieb:</p>
<blockquote>
<p>Entschuldige das habe ich nicht ganz verstanden.<br />
Ich habe den Part mal angepasst so wie ich das verstanden habe?</p>
<pre><code>ifstream input(filepath);
  
    if (!input.is_open()) 
        return false;
    
    while (getline(input,tmp))
    {
        switch (parse_mode)
        {
        case 'A': { parse_func_alpha(tmp); } break;
        case 'B': { parse_func_beta(tmp); } break;
        }
    
    }
</code></pre>
</blockquote>
<p>Ja. So klappt das auch bei Lesefehlern (Dateiende!) korrekt.</p>
<blockquote>
<p>Wenn ich etwas besser machen kann dann bitte sagen.</p>
</blockquote>
<p>Puh, ganz schön kompliziert. Da sind eine Menge Detailsverbesserungen möglich, beispielsweise:</p>
<pre><code>string temp(begin, end);
anderer_string = std::move(temp);
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<pre><code>anderer_String.assign(begin, end);
</code></pre>
<p>Irgendwie bin ich verwirrt, wie du std::move und seinen Nutzen kennen kannst, aber gleichzeitig dir Grundlagen über Strings unbekannt zu sein scheinen. <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 />
(Übrigens: Fast immer wenn man etwas &quot;temp&quot; oder ähnlich nennt, ist dies ein guter Hinweis, dass man das Objekt gar nicht braucht. Temporäre Zwischenwerte braucht man nur im Falle schlechter Schnittstellen. Die C++-Standardbibliotheksschnittstellen gehören in der Regel nicht dazu und wenn es deine eigenen Schnittstellen sind, dann verbessere sie!)</p>
<p>Oder dein ganzes geswitche: Das ist doch bei dir bloß eine super umständliche Art und Weise für ein einfaches if!</p>
<pre><code>if(Bedingung A)
  modus = 1;
else if (Bedingung B)  // bei dir fehlt übrigens das else in der Logik
  modus = 2;

switch (modus)
{
  1: Code 1; break;
  2: Code 2; break;
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<pre><code>if(Bedingung A)
  Code 1;
else if (Bedingung B)
  Code 2;
</code></pre>
<p>Wieder bin ich erstaunt über die Diskrepanz zwischen den benutzten Sprachmitteln (da weißt du viel) und wie sie letztendlich benutzt werden (da weißt fast gar nichts). Hast du den Code alleine geschrieben? (Teilweise?) abgeschrieben?</p>
<p>Und Buchstaben schreibt man im Code auch als Buchstaben. Schreib 'A' statt 65, dann weiß auch jeder, was gemeint ist.</p>
<p>Was soll der Teil überhaupt? Soll das den letzten Großbuchstaben finden? Wo kommt das in deinem Format vor?</p>
<p><strong>ABER:</strong> Wie schon erwähnt würde ich hier gar nicht über einen String gehen, sondern direkt lesen. Das heißt alle obigen Tipps sind nur als Hinweise zu sehen, ich würde den Code insgesamt ganz anders schreiben. Leider ist mir unklar, was genau du willst, daher kann ich es nicht vormachen. Gib mal ein paar Beispieldaten und wie sich der Zustand von Mgr ändern soll, wenn diese verarbeitet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408255</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 11 Jul 2014 19:32:24 GMT</pubDate></item><item><title><![CDATA[Reply to Functionpointer in Konstruktor zuweisen on Sun, 13 Jul 2014 22:16:26 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Wieder bin ich erstaunt über die Diskrepanz zwischen den benutzten Sprachmitteln (da weißt du viel) und wie sie letztendlich benutzt werden (da weißt fast gar nichts). Hast du den Code alleine geschrieben? (Teilweise?) abgeschrieben?</p>
</blockquote>
<p>Nein, ich habe alles alleine geschrieben.<br />
Ich habe vor einem Jahr kurz Javascript angefangen und bin dann aber gleich auf C++ umgestiegen, weil mir das erste &quot;Hello World&quot; soviel Spaß gemacht hat und ich eine getypte Sprache einfach toll fand.</p>
<p>Ich muss auch sagen, dass ich es toll finde wie komplex und kompliziert die Sprache ist.<br />
Ich mache das nicht beruflich sondern ist ein Hobby von mir nachdem Feierabend.<br />
Ab und zu programmier ich auch etwas um mir das Leben auf Arbeit zu erleichtern.</p>
<p>Ich habe vor allem durch Bücher gelernt, wobei ich wirklich große Probleme hatte geeignetes Lernmaterial zu finden. Ich habe zuhause an die 10 C++ Bücher rumliegen und leider sind nur die Bücher gut die sich um Detailfragen/Optimierungen der Sprache drehen.<br />
z.B.:<br />
Effective C++ programmieren<br />
More Effective C++<br />
Effective STL<br />
C++11</p>
<p>Allerdings sind das alles Bücher in denen es um Detailverbesserungen geht und nicht um &quot;Wie implementiere ich eine File-Lese Funktion&quot;.<br />
Da habe ich bis jetzt kein einziges anständiges Buch gefunden.<br />
Vielleicht könnt ihr mir da weiterhelfen ein passendes Buch zu finden?</p>
<p>Wenn man alleine vor dem Rechner sitzt und sozusagen in seinem eigenen Saft schmort ist es, finde ich, einfach schwer da &quot;Programm funktioniert&quot; nicht gleichbedeutend mit gutem Code oder einer guten Architektur ist.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Und Buchstaben schreibt man im Code auch als Buchstaben. Schreib 'A' statt 65, dann weiß auch jeder, was gemeint ist.</p>
<p>Was soll der Teil überhaupt? Soll das den letzten Großbuchstaben finden? Wo kommt das in deinem Format vor?</p>
</blockquote>
<p>Ich wusste nicht, dass ich die größer/gleich Operatoren auch auf die chars anwenden kann. Daher habe ich die Nummern verwendet.</p>
<p>Das ist für die Caption. Die kann manchmal so aussehen:<br />
&quot;?{Text} = FOO BAR\t\t\t\t&quot; (Anführungszeichen wegdenken)</p>
<p>Ich schiebe also den End-Iterator an der Stelle immer weiter, bis ich zum letzten Großbuchstaben komme, da ich die Tabulatoren Zeichen nicht mitnehmen will.</p>
<p>Vielen Dank für den Tip mit dem assign.<br />
Ich habe genau sowas gesucht.<br />
Ich hätte in der cplusplus reference genauer gucken müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408266</guid><dc:creator><![CDATA[chp++]]></dc:creator><pubDate>Sun, 13 Jul 2014 22:16:26 GMT</pubDate></item></channel></rss>