<?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]]></title><description><![CDATA[<p>Hallo!<br />
Ich möchte eine Klasse &quot;vec3f&quot; haben, in der drei Koordinaten (x, y, z) als floats gespeichert werden. Diese drei Koordinaten möchte ich einzeln als Membervarjiablen vec3f.x, vec3f.y, vec3f.z ansprechen können.<br />
Gleichzeitig möchte ich diese Koordinaten direkt als Array (also Pointer) an eine Funktion übergeben können. Es ist also wichtig, dass die Variablen x, y, z genauso gespeichert werden wie es in einem Array der Fall wäre. Wie bekomme ich das hin?<br />
So geht es offenbar nicht:</p>
<pre><code class="language-cpp">union
{
    float x, y, z;
    float xyz[3];
}
</code></pre>
<p>,<br />
denn so teilen sich x, y und z alle den gleichen Speicherplatz.<br />
Uns so funktioniert es auch nicht:</p>
<pre><code class="language-cpp">class blub
{
public:
		float x, y, z;
		float *xyz;
		blub(float x, float y, float z)
		{
			this-&gt;x=x;
			this-&gt;y=y;
			this-&gt;z=z;
			xyz=&amp;x;
		}
};

int main()
{
	blub blah(1.0f, 2.0f, 3.0f);
	printf(&quot;%.1f %.1f\n&quot;, blah.x, blah.xyz[0]);
	printf(&quot;%.1f %.1f\n&quot;, blah.y, blah.xyz[1]);
	printf(&quot;%.1f %.1f\n&quot;, blah.z, blah.xyz[2]);
	return 0;
}
</code></pre>
<p>Ausgabe ist dann hier:</p>
<pre><code>1.0 1.0
2.0 1.9
3.0 0.0
</code></pre>
<p>Gibt es da irgendeine Möglichkeit? Bitte keine so naheliegenden Vorschläge wie</p>
<pre><code class="language-cpp">void x()
{
    return xyz[0];
}
void y()
{
    return xyz[1];
}
void z()
{
    return xyz[2];
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">float &amp;operator[](unsigned i)
{
    switch (i)
    {
    case 0:
        return x;
    case 1:
        return y;
    case 2:
        return z;
    }
    return whatever;
}
</code></pre>
<p>Ich möchte nämlich gern auf die Koordinaten einfach zugreifen können wie auf public Membervariablen ohne Funktionsklammern().<br />
Und ich möchte die Elemente nicht nur durch Indizes erreichen können wie bei einem Array sondern auch, dass sie so gespeichert sind wie in einem Array, damit ich einen Array-Zeiger an eine andere Funktion übergeben kann.<br />
Und ich will Spannung.<br />
Und Schokolade!<br />
Kann mir jemand helfen?</p>
<p>Viele Grüße<br />
Krecik</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/222249/union</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 07:50:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222249.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Sep 2008 19:58:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to union on Tue, 09 Sep 2008 19:58:49 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich möchte eine Klasse &quot;vec3f&quot; haben, in der drei Koordinaten (x, y, z) als floats gespeichert werden. Diese drei Koordinaten möchte ich einzeln als Membervarjiablen vec3f.x, vec3f.y, vec3f.z ansprechen können.<br />
Gleichzeitig möchte ich diese Koordinaten direkt als Array (also Pointer) an eine Funktion übergeben können. Es ist also wichtig, dass die Variablen x, y, z genauso gespeichert werden wie es in einem Array der Fall wäre. Wie bekomme ich das hin?<br />
So geht es offenbar nicht:</p>
<pre><code class="language-cpp">union
{
    float x, y, z;
    float xyz[3];
}
</code></pre>
<p>,<br />
denn so teilen sich x, y und z alle den gleichen Speicherplatz.<br />
Uns so funktioniert es auch nicht:</p>
<pre><code class="language-cpp">class blub
{
public:
		float x, y, z;
		float *xyz;
		blub(float x, float y, float z)
		{
			this-&gt;x=x;
			this-&gt;y=y;
			this-&gt;z=z;
			xyz=&amp;x;
		}
};

int main()
{
	blub blah(1.0f, 2.0f, 3.0f);
	printf(&quot;%.1f %.1f\n&quot;, blah.x, blah.xyz[0]);
	printf(&quot;%.1f %.1f\n&quot;, blah.y, blah.xyz[1]);
	printf(&quot;%.1f %.1f\n&quot;, blah.z, blah.xyz[2]);
	return 0;
}
</code></pre>
<p>Ausgabe ist dann hier:</p>
<pre><code>1.0 1.0
2.0 1.9
3.0 0.0
</code></pre>
<p>Gibt es da irgendeine Möglichkeit? Bitte keine so naheliegenden Vorschläge wie</p>
<pre><code class="language-cpp">void x()
{
    return xyz[0];
}
void y()
{
    return xyz[1];
}
void z()
{
    return xyz[2];
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">float &amp;operator[](unsigned i)
{
    switch (i)
    {
    case 0:
        return x;
    case 1:
        return y;
    case 2:
        return z;
    }
    return whatever;
}
</code></pre>
<p>Ich möchte nämlich gern auf die Koordinaten einfach zugreifen können wie auf public Membervariablen ohne Funktionsklammern().<br />
Und ich möchte die Elemente nicht nur durch Indizes erreichen können wie bei einem Array sondern auch, dass sie so gespeichert sind wie in einem Array, damit ich einen Array-Zeiger an eine andere Funktion übergeben kann.<br />
Und ich will Spannung.<br />
Und Schokolade!<br />
Kann mir jemand helfen?</p>
<p>Viele Grüße<br />
Krecik</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579460</guid><dc:creator><![CDATA[Krecik]]></dc:creator><pubDate>Tue, 09 Sep 2008 19:58:49 GMT</pubDate></item><item><title><![CDATA[Reply to union on Tue, 09 Sep 2008 20:05:54 GMT]]></title><description><![CDATA[<p>Es gibt keine standardkonforme Möglichkeit, dieses Layout zu erzwingen. Umgekehrt ist es dagegen sehr wohl möglich, bereits während des Compilierens zu überprüfen, ob eine Klasse</p>
<pre><code class="language-cpp">struct Foo { float x,y,z; };
</code></pre>
<p>ein Layout äquivalent zu dem eines Arrays hat. Das dürfte für die meisten praktischen Fälle völlig ausreichen.</p>
<pre><code class="language-cpp">BOOST_STATIC_ASSERT(( sizeof( Foo ) == sizeof( float[3] ) ));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1579464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579464</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 09 Sep 2008 20:05:54 GMT</pubDate></item><item><title><![CDATA[Reply to union on Tue, 09 Sep 2008 20:23:43 GMT]]></title><description><![CDATA[<p>schau mal obs so geht:</p>
<pre><code class="language-cpp">class Vec
{
  public:
   float  asArray[3];
   float&amp; x;
   float&amp; y;
   float&amp; z;
   Vec()
   : x(asArray[0])
   , y(asArray[1])
   , z(asArray[2])
   {
   }
}
</code></pre>
<p>Zur Erklärung:<br />
hier werden 3 referenzen auf das Array erzeugt. Diese sind nur aliase und sollten zur laufzeit keinen Speischer beanspruchen!</p>
<p>oder, was aber noch weniger schön ist:</p>
<pre><code class="language-cpp">typedef union Vec{
  struct{
    float x;
    float y;
    float z;
  };    
  float asArr[3]
}Vec;
</code></pre>
<p>Zugriff über</p>
<pre><code class="language-cpp">Vec a;
a.x;
</code></pre>
<p>das geht allerdings nur mit dem visual c/c++ compiler und er produziert ne warnung (&quot;Non standard c-Estension (unnamed struct)...&quot;, oder so)</p>
<p>ansonsten musst du dem substruct einen namen geben und dann eben so ansprechen:</p>
<pre><code class="language-cpp">typedef union Vec{
  struct{
    float x;
    float y;
    float z;
  }asXYZ;    
  float asArr[3]
}Vec;
</code></pre>
<pre><code class="language-cpp">Vec a;
 a.asXYZ.x
</code></pre>
<p>Ich find aber keine der Beiden lösungen gut!<br />
Wenns eine kleine Kompakte Klasse sein soll, dann lass es so, wenns aber was größeres sein sollte, dann sollten die daten nahc außen versteckt werden:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Vec
{
  public:
   T&amp; x() { return m_data[0] };
   T&amp; y() { return m_data[1] };
   T&amp; z() { return m_data[2] };

   const T&amp; x() { return m_data[0]; } const;
   const T&amp; y() { return m_data[1]; } const;
   const T&amp; z() { return m_data[2]; } const;

   T&amp; operator[](int i) { return m_data[i]; };
   const T&amp; operator[](int i) { return m_data[i]; } const;

   /* weitere funktionen */

  private:
   T m_data[3];
}
</code></pre>
<p>oder etwas konventioneller per getter und setter:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Vec
{
  public:

   const T&amp; getX() { return m_data[0]; } const;
   const T&amp; getY() { return m_data[1]; } const;
   const T&amp; getZ() { return m_data[2]; } const;

   void setX(T i_val) { m_data[0] = i_val; } ;
   void setY(T i_val) { m_data[1] = i_val; } ;
   void setZ(T i_val) { m_data[2] = i_val; } ;

   T&amp; operator[](int i) { return m_data[i]; };
   const T&amp; operator[](int i) { return m_data[i]; } const;

   /* weitere funktionen */

  private:
   T m_data[3];
}
</code></pre>
<p>Edit:<br />
Erklärungen hizugefügt, sowie weitere Varianten und bugfixes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579466</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Tue, 09 Sep 2008 20:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to union on Tue, 09 Sep 2008 20:46:05 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>schau mal obs so geht:</p>
<pre><code class="language-cpp">class Vec
{
  public:
   float  asArray[3];
   float&amp; x;
   float&amp; y;
   float&amp; z;
   Vec()
   : x(asArray[0])
   , y(asArray[1])
   , z(asArray[2])
   {
   }
}
</code></pre>
</blockquote>
<p>Vielen Dank, das ist genau das, was ich brauchte. Funktioniert astrein! <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>Kaffee sei mit euch<br />
Krecik</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579480</guid><dc:creator><![CDATA[Krecik]]></dc:creator><pubDate>Tue, 09 Sep 2008 20:46:05 GMT</pubDate></item><item><title><![CDATA[Reply to union on Tue, 09 Sep 2008 20:55:37 GMT]]></title><description><![CDATA[<p>Gruselig. Vergiss bitte wenigstens nicht den Copy-ctor und den Zuweisungsoperator. All die anderen Probleme werden ja sowieso ignoriert, man denke nur an Sachen wie const-Korrektheit...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579486</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 09 Sep 2008 20:55:37 GMT</pubDate></item></channel></rss>