<?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[Union Hack]]></title><description><![CDATA[<p>Guten Tag,</p>
<p>jetzt habe ich hier ein dummes Problem. In meiner Geometrie-Lib, hatte ich Rechtecke gewollt, wo ich sowohl direkten Zugriff auf die elementaren Koordinaten bzw. Größen hatte, wie auch auf den Ursprungspunkt und die kombininierte Größe.</p>
<p>Also so (ohne templates jetzt):</p>
<pre><code class="language-cpp">struct BSize {
   int SX,SY;
};

struct Size : public BSize
{
//...
};

struct BPoint {
    int X,Y;
};

struct Point : public BPoint
{
//...
};

struct Rect {
//...

    union {
       struct { int X, int Y };
       BPoint P;
    };

    union {
       struct { int SX, int SY };
       BSize S;
    };
};
</code></pre>
<p>So, das funktioniert auch alles toll, bis man auf die Idee kommt, dass man gerne Konstante Punkte und Größen definieren/erzeugen möchte. Dann bräuchte man auf einmal einen Konstruktor in BSize/BPoint und damit sind sie nicht mehr dafür gut, als Element in dem Union zu dienen.</p>
<p>Fällt euch eine Abhilfe ein? Eigentlich möchte ich nur einfachen Zugriff auf X, Y, SX, SY sowie den zusammengesetzten P und S haben, aber mir ist C++ hier im Weg -.-.</p>
<p>Viele Grüße,<br />
Deci</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312644/union-hack</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 18:00:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312644.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Jan 2013 11:03:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Union Hack on Thu, 10 Jan 2013 11:03:28 GMT]]></title><description><![CDATA[<p>Guten Tag,</p>
<p>jetzt habe ich hier ein dummes Problem. In meiner Geometrie-Lib, hatte ich Rechtecke gewollt, wo ich sowohl direkten Zugriff auf die elementaren Koordinaten bzw. Größen hatte, wie auch auf den Ursprungspunkt und die kombininierte Größe.</p>
<p>Also so (ohne templates jetzt):</p>
<pre><code class="language-cpp">struct BSize {
   int SX,SY;
};

struct Size : public BSize
{
//...
};

struct BPoint {
    int X,Y;
};

struct Point : public BPoint
{
//...
};

struct Rect {
//...

    union {
       struct { int X, int Y };
       BPoint P;
    };

    union {
       struct { int SX, int SY };
       BSize S;
    };
};
</code></pre>
<p>So, das funktioniert auch alles toll, bis man auf die Idee kommt, dass man gerne Konstante Punkte und Größen definieren/erzeugen möchte. Dann bräuchte man auf einmal einen Konstruktor in BSize/BPoint und damit sind sie nicht mehr dafür gut, als Element in dem Union zu dienen.</p>
<p>Fällt euch eine Abhilfe ein? Eigentlich möchte ich nur einfachen Zugriff auf X, Y, SX, SY sowie den zusammengesetzten P und S haben, aber mir ist C++ hier im Weg -.-.</p>
<p>Viele Grüße,<br />
Deci</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288220</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 10 Jan 2013 11:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Union Hack on Thu, 10 Jan 2013 11:08:21 GMT]]></title><description><![CDATA[<p>Getter und Setter mit Referenzen? X und Y sind ja in BPoint enthalten, SX und SY in BSize. Warum nochmals im union definieren? Den union kannst du gleich weglassen <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/2288221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288221</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Thu, 10 Jan 2013 11:08:21 GMT</pubDate></item><item><title><![CDATA[Reply to Union Hack on Thu, 10 Jan 2013 11:13:08 GMT]]></title><description><![CDATA[<p>Sinn und Zweck eine union ist weder das Sparen von Schreibarbeit noch Hacken. Deine Beschreibung klingt eher so, als sollten Size und Point Zugriffsmöglichkeiten auf die Koordinaten anbieten. Rect benutzt diese dann und stellt gewünschtenfalls diese Funktionen der Außenwelt zur Verfügung.</p>
<p>P.S.: Der Sinn und Zweck einer Union ist eigentlich Speichersparen. Was heutzutage sicherlich eher selten vorkommen sollte. Der übliche Hack mit unions wird auf den meisten Systemen ebenfalls funktionieren, zumindest mit PODs. Mache (alle?) Compiler garantieren sogar, dass es funktioniert. Ich würde es in C++ aber trotzdem nicht benutzen, denn üblicherweise schadest du dir selber, wenn du das Typensystem aushebelst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288222</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 10 Jan 2013 11:13:08 GMT</pubDate></item><item><title><![CDATA[Reply to Union Hack on Thu, 10 Jan 2013 11:11:21 GMT]]></title><description><![CDATA[<p>Vielleicht, aber auch nur vielleicht kannst du eine Methode anbieten die da was castet:</p>
<pre><code>struct Rect {
	struct { int X, int Y };
	BPoint getP() { return *reinterpret_cast&lt;BPoint*&gt;(&amp;X);}

	struct { int SX, int SY };
	BSize getP() { return *reinterpret_cast&lt;BSize*&gt;(&amp;SX);}
};
</code></pre>
<p>So in der Richtung. Ich meine, Membervariablen liegen direkt hintereinander im Speicher. Das heisst, wenn du per &quot;Array&quot; auf X zugreifst, dann wäre X[0] X selbst und X[1] wäre Y.</p>
<p>Valve macht das so bei einer Klasse für Farben in der Source Engine.<br />
Etwa so, falls ich das richtig im Kopf habe</p>
<pre><code>class Colo
{
	byte r, g, b, a;

	int getColor()
	{
		return *(reinterpret_cast&lt;int*&gt;(&amp;r));
	}
};
</code></pre>
<p>Die Vor-/Nachteile und Stolperfallen kannst du dir ja denken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288224</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 10 Jan 2013 11:11:21 GMT</pubDate></item><item><title><![CDATA[Reply to Union Hack on Thu, 10 Jan 2013 11:22:31 GMT]]></title><description><![CDATA[<p>Naja, ich möchte halt schreiben können:</p>
<pre><code class="language-cpp">Point p1 = r.O;
   Point p2 /* = irgendwas */;

   r.S = p2 - p1;
   r.S() = p2 - p1; // wie hässlich ist das denn bitte?
</code></pre>
<p>Jetzt könnte ich natürlich Getter und Setter dahinfriemeln, die eben ein Size&lt;TX&amp;,TY&amp;&gt;-Proxy zurückgeben (das dann bitte bitte direkt vom Compiler wieder geschluckt wird), aber dann schreibe ich im User-Code überall Klammern, wo ich in den Ausdrücken keine Klammern sehen will, weil sie mir die mathematischen Formeln zumüllen. Hätte C++ Properties, wäre das ja alles kein Problem -.-.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288227</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 10 Jan 2013 11:22:31 GMT</pubDate></item><item><title><![CDATA[Reply to Union Hack on Thu, 10 Jan 2013 11:59:54 GMT]]></title><description><![CDATA[<p>Mach S public, gib dem Typen von S passende Zuweisungsoperatoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288236</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 10 Jan 2013 11:59:54 GMT</pubDate></item><item><title><![CDATA[Reply to Union Hack on Thu, 10 Jan 2013 12:15:06 GMT]]></title><description><![CDATA[<p>Meinst du ein solches S, wie ich es in der letzten Zeile meines letzten Beispiels aufgezeigt habe? Also ein Getter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288248</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 10 Jan 2013 12:15:06 GMT</pubDate></item><item><title><![CDATA[Reply to Union Hack on Thu, 10 Jan 2013 12:22:10 GMT]]></title><description><![CDATA[<p>Ich bin mir nicht sicher, was du mir mit dem Beispiel zeigen wolltest. Wenn du willst, dass man <code>r.S = p2 - p1;</code> schreiben kann, dann mach S ein public-Member. Ich sehe nicht, wozu du da überhaupt eine union brauchst. Wenn man zusätzlich noch <code>r.S.x = 2;</code> schreiben können soll, dann mach eben das x auch public. Kurz: Wenn du willst, dass man an den Innereien deiner Klasse rumfummeln kann, dann mach sie eben auch public und fang nicht an, deine eigenen Klassen zu hacken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288251</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 10 Jan 2013 12:22:10 GMT</pubDate></item><item><title><![CDATA[Reply to Union Hack on Thu, 10 Jan 2013 12:35:25 GMT]]></title><description><![CDATA[<p>Nunja, dann würde ich überall, wo ich den elementaren Zugriff brauche, schreiben müssen:</p>
<pre><code class="language-cpp">r.S.SX = foo;
</code></pre>
<p>Da mag ich den &quot;tradeoff&quot;</p>
<pre><code class="language-cpp">r.S() = foo;
   r.SX  = bar;
</code></pre>
<p>lieber.<br />
Irgendwie wäre ein Konstrukt wie</p>
<pre><code class="language-cpp">struct Bla {
  struct { int a; } Blubb;
  using b = Blubb.a;
};
</code></pre>
<p>toll <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/2288257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288257</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 10 Jan 2013 12:35:25 GMT</pubDate></item></channel></rss>