<?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[Referenz zurückgeben]]></title><description><![CDATA[<p>Hallo!</p>
<p>Folgende Situation:</p>
<p>Ich habe eine Klasse mit einem assoziativem Array auf das ich über Zugriffsfunktionen zugreifen will:</p>
<pre><code>class Parameters
{
    QVariant&amp; parameter(const QString&amp; name)
    {
        if(params_.contains(name))
            return params_[name];

        static QVariant&amp; invalidParameter;
        return invalidParameter;
    }

private:
    QMap&lt;QString, QVariant&gt; params_;

};
</code></pre>
<p>Ich möchte hier bei der Funktion parameter() eine Referenz benützen und weder Pointer noch eine Kopie des QVariants benützen.</p>
<p>Mein Problem:<br />
Dadurch, dass die Funktion parameter() eine Referenz zurückgibt, kann man die intern benütze Variable eines ungültigen Parameters (invalidParameter) von außen ändern. Ich kann invalidParameter allerdings aufgrund der Signatur der Funktion nicht const machen (Und die Signatur soll nicht const sein).</p>
<p>Die einzige Lösung, die mir einfällt, wäre vor dem zurückgeben von invalidParameter, dieses Wert wieder auf QVariant() zu setzen</p>
<pre><code>if(invalidParameter.isValid())
    invalidParameter = QVariant();
</code></pre>
<p>Wisst ihr vielleicht eine bessere Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330517/referenz-zurückgeben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 06:12:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330517.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Jan 2015 07:26:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenz zurückgeben on Wed, 14 Jan 2015 07:26:41 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Folgende Situation:</p>
<p>Ich habe eine Klasse mit einem assoziativem Array auf das ich über Zugriffsfunktionen zugreifen will:</p>
<pre><code>class Parameters
{
    QVariant&amp; parameter(const QString&amp; name)
    {
        if(params_.contains(name))
            return params_[name];

        static QVariant&amp; invalidParameter;
        return invalidParameter;
    }

private:
    QMap&lt;QString, QVariant&gt; params_;

};
</code></pre>
<p>Ich möchte hier bei der Funktion parameter() eine Referenz benützen und weder Pointer noch eine Kopie des QVariants benützen.</p>
<p>Mein Problem:<br />
Dadurch, dass die Funktion parameter() eine Referenz zurückgibt, kann man die intern benütze Variable eines ungültigen Parameters (invalidParameter) von außen ändern. Ich kann invalidParameter allerdings aufgrund der Signatur der Funktion nicht const machen (Und die Signatur soll nicht const sein).</p>
<p>Die einzige Lösung, die mir einfällt, wäre vor dem zurückgeben von invalidParameter, dieses Wert wieder auf QVariant() zu setzen</p>
<pre><code>if(invalidParameter.isValid())
    invalidParameter = QVariant();
</code></pre>
<p>Wisst ihr vielleicht eine bessere Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437462</guid><dc:creator><![CDATA[basc_guess]]></dc:creator><pubDate>Wed, 14 Jan 2015 07:26:41 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz zurückgeben on Wed, 14 Jan 2015 07:52:46 GMT]]></title><description><![CDATA[<p>Mach's doch so wie das assoziative Array der Standardbibliothek: Gib einen Iterator anstatt einer Referenz zurück und als Fehlerwert eben einen ungültigen Iterator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437467</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 14 Jan 2015 07:52:46 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz zurückgeben on Wed, 14 Jan 2015 07:53:53 GMT]]></title><description><![CDATA[<p>Exceptions<br />
Deinen invalidParameter als Referenz anzulegen ist sowieso falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437468</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 14 Jan 2015 07:53:53 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz zurückgeben on Wed, 14 Jan 2015 08:06:56 GMT]]></title><description><![CDATA[<p>ich hab natürlich gemeint</p>
<pre><code>static QVariant invalidParameter;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2437472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437472</guid><dc:creator><![CDATA[basc_guess]]></dc:creator><pubDate>Wed, 14 Jan 2015 08:06:56 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz zurückgeben on Wed, 14 Jan 2015 08:17:33 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>:<br />
Ist dann leider ein bisschen unpraktisch, weil ich zusätzlich eine Funktion machen muss, die dann angibt ob der Iterator gültig ist oder nicht</p>
<p>@manni66:<br />
In der Library, die ich erweitere werden sonst nirgends Exceptions benützt und daher wäre das ein Designbruch leider</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437473</guid><dc:creator><![CDATA[basc_guess]]></dc:creator><pubDate>Wed, 14 Jan 2015 08:17:33 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz zurückgeben on Wed, 14 Jan 2015 08:40:30 GMT]]></title><description><![CDATA[<p>basc_guess schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>:<br />
Ist dann leider ein bisschen unpraktisch, weil ich zusätzlich eine Funktion machen muss, die dann angibt ob der Iterator gültig ist oder nicht</p>
</blockquote>
<p>Mach das doch auch so wie die Standardbibliothek und lass den end-Iterator eine Doppelschicht schieben. Einen end-Iterator hast du doch sicherlich sowieso.</p>
<p>PS: Beziehungsweise, wenn wir schon mit anderen Bibliotheken vergleichen: Die von dir genutzt QMap macht das doch genau so wie die C++-Standardbibliothek. Dann kannst du auch gleich Qmap::find nutzen, anstatt da deine eigene Abfrage zu machen, was wesentlich effizienter ist, da nicht doppelt gesucht werden muss. Selbst wenn du die Iteratorlösung aus irgendeinem Grund nicht übernehmen solltest, sehe ich nichts was dagegen spräche, wenigsten QMap::find zu nutzen und deine Funktion einfach mal eben so doppelt so schnell zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437474</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 14 Jan 2015 08:40:30 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz zurückgeben on Wed, 14 Jan 2015 09:36:57 GMT]]></title><description><![CDATA[<p>Wie baut man sich seien eigenen Iterator ? Da müssen Pointer ran oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437478</guid><dc:creator><![CDATA[how_to]]></dc:creator><pubDate>Wed, 14 Jan 2015 09:36:57 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz zurückgeben on Wed, 14 Jan 2015 11:13:09 GMT]]></title><description><![CDATA[<p>how_to schrieb:</p>
<blockquote>
<p>Wie baut man sich seien eigenen Iterator ? Da müssen Pointer ran oder?</p>
</blockquote>
<p>Kommt ganz drauf an, kann man so pauschal nicht sagen. Letztlich ist ein Iterator aber ein pointerartiges Gebilde und die meisten Datentstrukturen arbeiten intern mit Pointern. Bei Iteratoren für Containerklassen ist daher wahrscheinlich, dass irgendwie Pointer beteiligt sind, wie auch immer gekapselt. In diesem Fall böte sich beispielsweise an, den QMap-Iterator direkt zu nutzen (der dann irgendwo ganz tief in den Interna ein Pointer sein wird). Der ganze Code scheint mir bloß ein sehr dünner Wrapper um QMap zu sein, der bloß ein paar Methoden umbenennt.</p>
<p>Ein Beispiel für Iteratoren, die ohne Zeiger auskommen wären beispielsweise die Streamiteratoren aus der Standardbibliothek.</p>
<p>Wenn du allgemein wissen möchtest, wie man Iteratoren schreibt, sie dir zuerst einmal die Klassierung unterschiedlicher Pointertypen im Standard an (zum Beispiel <a href="http://www.cplusplus.com/reference/iterator/" rel="nofollow">hier</a> tabelliert). Da steht, was ein Iterator können <em>sollte</em>. Es ist keine Pflicht, sich da dran zu halten, aber wenn man es tut, kann man anderen Programmierern einfach kommunizieren, was der Iterator kann. Und besser noch, man kann fremdem Programmcode (z.B. den Standardbibliotheksalgorithmen) kommunizieren, was der Iterator kann:<br />
<a href="http://www.cplusplus.com/reference/iterator/iterator_traits/" rel="nofollow">http://www.cplusplus.com/reference/iterator/iterator_traits/</a><br />
So kann dann ein cleverer Code mittels TMP rausfinden, welcher Algorithmus die beste Wahl für eine gegebene Art von Iterator ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437490</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 14 Jan 2015 11:13:09 GMT</pubDate></item></channel></rss>