<?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[std::map und Referenzen auf value]]></title><description><![CDATA[<p>Ist folgendes Beispiel definiert? Funktioniert es mit allen Compilern?<br />
Oder ist meine Denken falsch?<br />
Was passiert, wenn die Map umkopiert wird? (und ich entry aus Zeile 37 danach weiter verwenden will?) Oder komme ich hier nicht drum herum mit Pointern und <code>new Y</code> zu arbeiten?</p>
<pre><code class="language-cpp">class Y
{
public:
	Y(const std::string &amp;key) :
		_key(key)
	{
	}

	void set_some_value(int a)
	{
		_a = a;
	}

private:
	std::string _key;
	int _a;
};

class X
{
public:
	Y &amp;append_entry(const std::string &amp;key)
	{
		Y entry(key);
		_data[key] = Y;

		return Y;
	}

private:
	std::map&lt;std::string, Y&gt; _data;
};

int main(int argc, char *argv[])
{
	X test;
	Y entry = test.append_entry(&quot;test&quot;);
	entry.set_some_value(200);

	return 0;
}
</code></pre>
<p>Vielen Dank! <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/304569/std-map-und-referenzen-auf-value</link><generator>RSS for Node</generator><lastBuildDate>Thu, 25 Jun 2026 12:47:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/304569.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Jun 2012 10:54:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::map und Referenzen auf value on Sat, 09 Jun 2012 10:54:23 GMT]]></title><description><![CDATA[<p>Ist folgendes Beispiel definiert? Funktioniert es mit allen Compilern?<br />
Oder ist meine Denken falsch?<br />
Was passiert, wenn die Map umkopiert wird? (und ich entry aus Zeile 37 danach weiter verwenden will?) Oder komme ich hier nicht drum herum mit Pointern und <code>new Y</code> zu arbeiten?</p>
<pre><code class="language-cpp">class Y
{
public:
	Y(const std::string &amp;key) :
		_key(key)
	{
	}

	void set_some_value(int a)
	{
		_a = a;
	}

private:
	std::string _key;
	int _a;
};

class X
{
public:
	Y &amp;append_entry(const std::string &amp;key)
	{
		Y entry(key);
		_data[key] = Y;

		return Y;
	}

private:
	std::map&lt;std::string, Y&gt; _data;
};

int main(int argc, char *argv[])
{
	X test;
	Y entry = test.append_entry(&quot;test&quot;);
	entry.set_some_value(200);

	return 0;
}
</code></pre>
<p>Vielen Dank! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2221274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221274</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sat, 09 Jun 2012 10:54:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Sat, 09 Jun 2012 11:10:01 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Y &amp;append_entry(const std::string &amp;key)
	{
		Y entry(key);
		_data[key] = Y;

		return Y;
	}
</code></pre>
<p>Du gibst eine Referenz auf ein lokales Stackobjekt zurück. Das erzeugt undefiniertes Verhalten sobald du versuchst mit der Referenz zu arbeiten. Denn lokale Objekte werden am Scopeende zerstört.</p>
<p>Allerdings dürfte ersteinmal nichts passieren, bis du versuchst mit der Referenz auf nicht-statische Membervariablen zuzugreifen (oder auf Funktionen, die auf nicht-statische Membervariablen zugreifen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2221279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221279</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 09 Jun 2012 11:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Sat, 09 Jun 2012 11:19:04 GMT]]></title><description><![CDATA[<p>Ohh, nee! In append_entry gibt die Funktion eine Referenz auf eine funktionslokale Variable zurück, die ja dann nicht mehr existiert. Außerdem speicherst du in Y eine Referenz auf einen String, die auch nicht gültig bleibt. Die Modifikation des entry-Objekts per set_... verändert die Map auch nicht. Das ist also totaler Käse alles.</p>
<p>Warum verwendest du die Map nicht einfach direkt? X und Y sind hier ja schon recht sinnfrei ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2221282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221282</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 09 Jun 2012 11:19:04 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Sat, 09 Jun 2012 12:52:37 GMT]]></title><description><![CDATA[<p>Es ist auch totaler Käse, weil nichtmal die Syntax passt.<br />
Y ist ne Klasse und keine Instanz, also kann man nicht einfach = Y oder return Y sagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2221326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221326</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 09 Jun 2012 12:52:37 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Sat, 09 Jun 2012 13:02:43 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Warum verwendest du die Map nicht einfach direkt? X und Y sind hier ja schon recht sinnfrei ...</p>
</blockquote>
<p>Das X und Y sinnfrei sind, weiß ich auch. Das ist ein aufs minimale runtergebrochene Beispiel.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Es ist auch totaler Käse, weil nichtmal die Syntax passt.<br />
Y ist ne Klasse und keine Instanz, also kann man nicht einfach = Y oder return Y sagen.</p>
</blockquote>
<p>Das ist korrekt. Habe mich in der Eile vertippt - sorry.</p>
<p>Wie arbeite ich denn dann richtig mit Referenzen und map-Entries? Oder geht das gar nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2221329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221329</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sat, 09 Jun 2012 13:02:43 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Sat, 09 Jun 2012 13:04:50 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20378">@theliquidwave</a><br />
Wenn ich wüsste was du eigentlich machen willst, könnte ich vielleicht ne Antwort geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2221332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221332</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 09 Jun 2012 13:04:50 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Sat, 09 Jun 2012 13:37:02 GMT]]></title><description><![CDATA[<p>Ich habe eine map&lt;string, Klasse&gt; in einer weiteren Klasse. Nun soll es mir möglich sein, anhand des strings (Key) eine Referenz auf die Klasse zu erhalten.</p>
<p>In Kurzfassung:</p>
<pre><code class="language-cpp">Klasse &amp;get_entry(std::string key)
{
    map_type::iterator it = _data.find(key);

    if (it != _data.end())
    {
        return it-&gt;second;
    }

    return _null_value;
}
</code></pre>
<p>Definiert oder ist es der gleiche Fall wie vorher (Referenz auf funktionslokale Variable)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2221347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221347</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Sat, 09 Jun 2012 13:37:02 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Sat, 09 Jun 2012 13:57:24 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>In Kurzfassung:</p>
<pre><code class="language-cpp">Klasse &amp;get_entry(std::string key)//Das ist also keine Memberfunktion? _data ist global deklariert?
{
    map_type::iterator it = _data.find(key);
    
    if (it != _data.end())
    {
        return it-&gt;second;
    }
    
    return _null_value;
}
</code></pre>
</blockquote>
<p>Solange <code>_null_value</code> global oder in der Klasse (als <code>static</code> und mit <code>const</code> -qualifier, damit nicht etwas doofes passiert wie du holst die Referenz und behälst sie bis nachdem das Objekt mit der map zerstört wurde) deklariert wurde, ist alles im Lot... wenn du das ganze auch wie oben deklarierst, kannst du (wie bei <code>find()</code> ) mit einer (Un)gleichung prüfen, ob ein Eintrag vorliegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2221354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221354</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 09 Jun 2012 13:57:24 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Sun, 10 Jun 2012 21:59:46 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>In Kurzfassung:</p>
<pre><code class="language-cpp">Klasse &amp;get_entry(std::string key)
{
    map_type::iterator it = _data.find(key);
    
    if (it != _data.end())
    {
        return it-&gt;second;
    }
    
    return _null_value;
}
</code></pre>
</blockquote>
<p>Das mit dem _null_value gefällt mir da zwar gar nicht, aber es ist okay, also keine Objektlebenszeit-Fehler.</p>
<p>Alternative1: Ausnahme werfen, falls Schlüssel nicht auffindbar</p>
<p>Alternative2: Objekt Default-konstruieren lassen, falls Schlüssel nicht auffindbar:</p>
<pre><code class="language-cpp">Klasse&amp; get_entry(std::string const&amp; key)
{
    return _data[key];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2221878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221878</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 10 Jun 2012 21:59:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Sun, 10 Jun 2012 22:48:08 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Alternative2: Objekt Default-konstruieren lassen, falls Schlüssel nicht auffindbar:</p>
</blockquote>
<p>Wobei sich dann bald die Frage stellt, was die Klasse überhaupt soll. Kann man bald std::map direkt verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2221883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221883</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 10 Jun 2012 22:48:08 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Mon, 11 Jun 2012 10:38:48 GMT]]></title><description><![CDATA[<p>Okay, danke.<br />
Es geht um eine Schlüsse-Wert-Gruppe, die endlos Tief gehen kann. (Jede Gruppe kann eine weitere Gruppe beinhalten)</p>
<p><code>_null_value</code> macht dahingehend Sinn, da folgendes möglich sein soll:</p>
<pre><code class="language-cpp">Block &amp;block = _root.GetBlock(&quot;hallo&quot;).GetBlock(&quot;test&quot;);

if (!block.IsValid())
{
    // _null_value;
}

int a;
block.GetValue(&quot;a&quot;, a);
</code></pre>
<p>Ergo: _null_value ist ein leerer Block, welcher ein <code>valid</code> -Flag auf false setzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2221960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221960</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 11 Jun 2012 10:38:48 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Mon, 11 Jun 2012 14:32:46 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20378">@theliquidwave</a><br />
Ich wollte gerade schreiben &quot;guck dir die XMLHandles von TinyXML(2) an&quot;.</p>
<p>Die erfüllen einen ähnlichen Zweck, nur auf etwas andere Art: man soll <code>doc-&gt;Get(&quot;foo&quot;)-&gt;Get(&quot;bar&quot;)</code> machen können ohne dass es fetzt, selbst wenn es &quot;foo&quot; schon nicht gibt.</p>
<p>Dummerweise ist die Online-Doku grad offline, sonst hätte ich dir die Seite verlinkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2222061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2222061</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 11 Jun 2012 14:32:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Tue, 12 Jun 2012 07:11:53 GMT]]></title><description><![CDATA[<p>Genau das kann man mit meiner Lösung doch auch machen. Oder ist sie schlecht, um so etwas realisieren? Ich finde es eigentlich optimal so (mit meinen eher beschränkten Kenntnissen über die STL).</p>
<p>Auf externe Libs habe ich nicht so viel Lust...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2222256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2222256</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 12 Jun 2012 07:11:53 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Tue, 12 Jun 2012 10:26:20 GMT]]></title><description><![CDATA[<p>Wieso gibst du nicht einfach einen Pointer zurück statt diesem merkwürdigem Konstrukt mit _null_value und IsValid()!?</p>
<p>Btw: _null_value ist im globalen Scope ein reservierter Name.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2222320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2222320</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 12 Jun 2012 10:26:20 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Referenzen auf value on Tue, 12 Jun 2012 16:48:31 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Genau das kann man mit meiner Lösung doch auch machen. Oder ist sie schlecht, um so etwas realisieren? Ich finde es eigentlich optimal so (mit meinen eher beschränkten Kenntnissen über die STL).</p>
</blockquote>
<p>Ich hab's nur erwähnt weil ich dachte vielleicht willst du dir ansehen wie das in einem anderen Projekt gelöst wurde.<br />
Und ich persönlich finde die &quot;Handle&quot; Lösung auch sauberer.<br />
Weil man sich dadurch etwas eine seltsam anmutende Eigenheit im primären Interface spart.</p>
<blockquote>
<p>Auf externe Libs habe ich nicht so viel Lust...</p>
</blockquote>
<p>?<br />
Hat ja auch keiner vorgeschlagen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2222453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2222453</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 12 Jun 2012 16:48:31 GMT</pubDate></item></channel></rss>