<?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[wrapper klasse, rückgabetyp vom operator= konstante referenz?]]></title><description><![CDATA[<p>Der Titel sagt es eigentlisch schon.<br />
Wenn ich ein Wrapper-Klassentemplate habe</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Wrapper
{
public:
   T member;

   ...
};
</code></pre>
<p>kann ich dann den operator= der wie folgt aussieht eine konstante refrerenz zurückgeben lassen ? wieso sieht man immer in beispielen nur normale referenzen?</p>
<pre><code class="language-cpp">...
   T&amp; operator=(const T&amp; other) { ... }

   // oder

   const T&amp; operator=(const T&amp; other) { ... }
   ...
</code></pre>
<p>Wäre über Hilfe dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/159500/wrapper-klasse-rückgabetyp-vom-operator-konstante-referenz</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 15:01:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/159500.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 15 Sep 2006 18:10:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to wrapper klasse, rückgabetyp vom operator= konstante referenz? on Fri, 15 Sep 2006 18:10:08 GMT]]></title><description><![CDATA[<p>Der Titel sagt es eigentlisch schon.<br />
Wenn ich ein Wrapper-Klassentemplate habe</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Wrapper
{
public:
   T member;

   ...
};
</code></pre>
<p>kann ich dann den operator= der wie folgt aussieht eine konstante refrerenz zurückgeben lassen ? wieso sieht man immer in beispielen nur normale referenzen?</p>
<pre><code class="language-cpp">...
   T&amp; operator=(const T&amp; other) { ... }

   // oder

   const T&amp; operator=(const T&amp; other) { ... }
   ...
</code></pre>
<p>Wäre über Hilfe dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1138128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138128</guid><dc:creator><![CDATA[ffrraaggeerr]]></dc:creator><pubDate>Fri, 15 Sep 2006 18:10:08 GMT</pubDate></item><item><title><![CDATA[Reply to wrapper klasse, rückgabetyp vom operator= konstante referenz? on Fri, 15 Sep 2006 18:27:33 GMT]]></title><description><![CDATA[<p>Um das nochmal klar zu stellen, ich kann mir denken dass wahrscheinlich beides möglich ist. Aber ich hätte gerne die Vor- und Nachteile beider Varianten gewusst :&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1138133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138133</guid><dc:creator><![CDATA[ffrraaggeerr]]></dc:creator><pubDate>Fri, 15 Sep 2006 18:27:33 GMT</pubDate></item><item><title><![CDATA[Reply to wrapper klasse, rückgabetyp vom operator= konstante referenz? on Fri, 15 Sep 2006 18:35:27 GMT]]></title><description><![CDATA[<p>das geht.<br />
man sieht nur normale, weil wir zu faul sind, da const hinzuschreiben.</p>
<p>ohne const ists genau wie bei int.<br />
(i=5)=4;<br />
geht.</p>
<p>mit const geht der quatsch nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1138138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138138</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 15 Sep 2006 18:35:27 GMT</pubDate></item><item><title><![CDATA[Reply to wrapper klasse, rückgabetyp vom operator= konstante referenz? on Fri, 15 Sep 2006 18:45:54 GMT]]></title><description><![CDATA[<p>prinzipiell gibt es keine besonderen einschränkungen hinsichtilich der signatur des operators=, außer dass er grundsätzlich genau einen parameter (neben dem objektparameter, op= ist immer eine nicht statische memberfunktion) hat. const, volatile, (rein) virtuell: alles ist möglich. allerdings kommt einem op=, der eine (evtl. cv-qualifizierte) referenz auf ein objekt dieser klasse nimmt, besondere bedeutung zu. jede klasse hat einen solchen operator (wenn man ihn nicht selbst deklariert, macht der compiler das und verdeckt damit jeden op= aller basisklassen). die signatur des implizit deklarierten operators= einer klasse A ist dabei entwader</p>
<pre><code class="language-cpp">A&amp; operator=(const A&amp;)
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">A&amp; operator(A&amp;)
</code></pre>
<p>welche version gewählt wird, hängt von den copy-ops der basisklassen und member ab.<br />
warum wird nun eine referenz zurückgegeben? damit wird das verhalten des zuweisungsoperators für primitive typen auf klassen übertragen. für eingebeute typen ist das ergebnis einer zuweisung ein (non-const) lvalue, das auf den linken operanden verweist (in C ist es ein rvalue). prinzipiell ist es dir freigestellt, eine const-referenz oder auch void oder irgendein Foo zurückzugeben. es schränkt dann aber möglicherweise die verwendung ein, ohne dass diese einschränkung irgendwie wirklich nützlich wäre.</p>
<p>Edit:</p>
<pre><code class="language-cpp">int i;
(i=5)=4;
</code></pre>
<p>ist well-formed, produziert aber undefiniertes verhalten.</p>
<pre><code class="language-cpp">struct Foo {};
Foo a={}, b={}, c={};
(a=b)=c;
</code></pre>
<p>ist dagegen wohldefiniert (wenn auch nicht besonders nützlich). interesanter sind dann aber fälle, in denen =c etwa durch einen aufruf einer memberfunktion ersetzt wird. etwa:</p>
<pre><code class="language-cpp">(*getFooPtr()=foo).bar(); // getFooPtr sei ein komplexer ausdruck oder eine komplexe funktion
</code></pre>
<p>hier ist es nicht unbedingt sinnvoll, das ganze in zwei statements aufzusplitten - will man den overhead der doppelten auswertung von getFooPtr vermeiden, müsste man nur dafür noch eine referenz oder einen pointer einführen. das erhöht nicht unbedingt die lesbarkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1138141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138141</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 15 Sep 2006 18:45:54 GMT</pubDate></item><item><title><![CDATA[Reply to wrapper klasse, rückgabetyp vom operator= konstante referenz? on Fri, 15 Sep 2006 18:53:08 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">(*getFooPtr()=foo).bar(); // getFooPtr sei ein komplexer ausdruck oder eine komplexe funktion
</code></pre>
<p>hier ist es nicht unbedingt sinnvoll, das ganze in zwei statements aufzusplitten - will man den overhead der doppelten auswertung von getFooPtr vermeiden, müsste man nur dafür noch eine referenz oder einen pointer einführen. das erhöht nicht unbedingt die lesbarkeit.</p>
</blockquote>
<p>Das ist wohl einigermaßen Ansichtssache. Ich persönlich kann schneller 10+ klar und simpel geschriebene Zeilen lesen und verstehen als eine einzige vollgestopft mit kryptischem Kauderwelsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1138146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138146</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 15 Sep 2006 18:53:08 GMT</pubDate></item><item><title><![CDATA[Reply to wrapper klasse, rückgabetyp vom operator= konstante referenz? on Sat, 16 Sep 2006 09:43:58 GMT]]></title><description><![CDATA[<p>Vielen Dank für eure hochqualifizierten Antworten <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 />
Da ich eine Klasse schreibe, die Properties in C++ emulieren soll, will ich dass sich diese property Klasse auch anfühlt wie ein 'T'.</p>
<p>In einem Fall ist es also besser eine nicht-konstante Referenz zurückzugeben.</p>
<p>Eine andere Frage:<br />
Ich will natürlich auch andere Operatoren wie &lt;&lt;, ++, += usw. überladen, damit sich die Klassen wirklich wie ein 'T' anfühlt.</p>
<p>Gibt es irgendwelche Referenzen oder Richtlinien nachdennen ich herausfinden kann wo wann welcher Parameter / Rückgabewert konstant usw. sein soll oder nicht?</p>
<p>Ich bin noch sehr viel am Ausprobieren und Rumprobieren <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="😉"
    /><br />
Dass heißt, es ist noch lääängst nicht fertig.</p>
<p>Im moment läuft es schon so, dass der Anwender nur dann den =operator aufrufen kann, wenn auch eine set funktion existiert, d.h. es im property &quot;erlaubt&quot; ist.</p>
<p>Mein größtest Problem ist, wie ich die Operatoren so implementiere, dass sie möglichst sich genau so verhalten wie ein Object der Klasse 'T'.</p>
<p>Meine Aufbau sieht im Moment so aus:</p>
<pre><code class="language-cpp">#ifndef _PROPERTY_INCLUDED_
#define _PROPERTY_INCLUDED_

// O -&gt; Owner Class (Car ... usw.)
// T -&gt; Value Type (int, std::string ... usw.)
// P -&gt; Property Class (_Speed, _Password ... siehe unten)
template&lt;class O, typename T, class P&gt;
class property : private P
{
public:
	typedef O	owner_class;
	typedef T	value_type;
	typedef P	property_class;

public:
	friend owner_class; // hierdurch kann die Owner Klasse auf value zugreifen

public:
	//! standard constructor
	property() {}

	//! destructor
	~property() {}

private:
	//! constructor by value
        //  implicit ?
	template&lt;class U&gt; explicit property(const U value) { property_class::value = value; }

public:
	//! get wrapper
	const T&amp; get() { return P::get(); }

	//! set wrapper
	void set(const T&amp; other) { P::set(other); }

public:
	//! copy-assignment operator (returns const value)
	//  this one gets called if there is no get()
	template&lt;class U&gt; const T operator=(const U other)
	{
		set(other);
		return other; 
	}

	//! copy-assignment operator (returns const value)
	//  this one gets called if there is a get()
	template&lt;class U&gt; const T&amp; operator=(const U other)
	{
		set(other);
		return get(); 
	}

	//! const cast operator
	template&lt;class U&gt; operator const U()
	{
		return get();
	}

	//! compare operator
	template&lt;class U&gt; bool operator==(const U&amp; other)
	{
		return get() == other;
	}

	//! not compare operator
	template&lt;class U&gt; bool operator!=(const U&amp; other)
	{
		return get() != other;
	}

	/* something like this?

	template&lt;class U, class W&gt; U operator&lt;&lt;(W other)
	{
		return get().operator&lt;&lt;(other);
	}

	template&lt;class U, class W&gt; U operator&gt;&gt;(W other)
	{
		return get().operator&gt;&gt;(other);
	}
	*/
};

// just a test solution, to test cout
template
&lt;
	class O,
	class T,
	class P,
	class _Elem,
	class _Traits
&gt;
inline std::basic_ostream&lt;_Elem, _Traits&gt;&amp;
	operator &lt;&lt;(std::basic_ostream&lt;_Elem, _Traits&gt;&amp; _Ostr, property&lt;O,T,P&gt;&amp; prop)
	{
		_Ostr &lt;&lt; prop.get();
		return (_Ostr);
	}

#endif //_PROPERTY_INCLUDED_
</code></pre>
<p>Benutzen lässt sich das wie folgt:</p>
<pre><code class="language-cpp">class Car
{
public:
   class _Speed
   {
   protected:
      int value;
   public:
      void set(const int&amp; value) { this-&gt;value = value; }
      const int&amp; get() const { return this-&gt;value; }
   };
   class _Password
   {
   protected:
      int value;
   public:
      void set(const int&amp; value) { this-&gt;value = value; }
      // no get function
   };

   property&lt;Car, int, _Speed&gt; Speed;
   property&lt;Car, int, _Password&gt; Password;

public:
   Car()
      : Speed(0), Password(&quot;some standard secret password&quot;)
   {}

   Car(const int speed, const std::string&amp; pw)
      : Speed(speed), Password(pw)
   {}

private:
   void some_private_function()
   {
      Speed.value = 2000;
   }
};

int main()
{
   Car c(100);

   c.Speed = 200;
   std::cout &lt;&lt; c.Speed &lt;&lt; std::endl;

   c.Password = &quot;blub&quot;;

   return 0;
}
</code></pre>
<p>ps: ich schreib das ganze nur aus spaß, da ich keine lust habe sowas wie:</p>
<pre><code class="language-cpp">c.setSpeed(c.getSpeed() + 100);
</code></pre>
<p>zu schreiben, stattdessen soll:</p>
<pre><code class="language-cpp">c.Speed += 100;
</code></pre>
<p>möglich sein.</p>
<p>Die Klasse kann dank der Friend Beziehung auf den protected Member &quot;value&quot; und den Konstruktor mit einem T als Parameter zugreifen, falls ein Member &quot;value&quot; existiert.</p>
<p>Es gibt auch Fälle, in dennen kein &quot;value&quot; existiert, z.b.:</p>
<pre><code class="language-cpp">...
class _Time
{
public:
   const float get() const { return MyCAPI_Call_GetTime(); }
   void set(const float p) { MyCAPI_Call_SetTime(p); }
};
property&lt;Car, float, _Time&gt; Time;
...
</code></pre>
<p>Diese Properties kann die Eigentümer Klasse dann z.b. so initialisieren</p>
<pre><code class="language-cpp">Car::Car()
: Time()
{
}
</code></pre>
<p>Wenn was anderes versucht wird, Fehler <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/1138349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138349</guid><dc:creator><![CDATA[ffrraaggeerr]]></dc:creator><pubDate>Sat, 16 Sep 2006 09:43:58 GMT</pubDate></item><item><title><![CDATA[Reply to wrapper klasse, rückgabetyp vom operator= konstante referenz? on Sat, 16 Sep 2006 09:55:24 GMT]]></title><description><![CDATA[<p>Du weißt das <em>class</em> und <em>typename</em> Parameter bei Templates das selbe tun? <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/1138359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138359</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 16 Sep 2006 09:55:24 GMT</pubDate></item><item><title><![CDATA[Reply to wrapper klasse, rückgabetyp vom operator= konstante referenz? on Sat, 16 Sep 2006 10:07:50 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Du weißt das <em>class</em> und <em>typename</em> Parameter bei Templates das selbe tun? <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>
</blockquote>
<p>Ja, ich benutze class um auszudrücken, dass es eine Klasse sein sollte und typename für allgemeine Typen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1138364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1138364</guid><dc:creator><![CDATA[ffrraaggeerr]]></dc:creator><pubDate>Sat, 16 Sep 2006 10:07:50 GMT</pubDate></item></channel></rss>