<?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[Kann eine Klasse einen Rückgabewert haben?]]></title><description><![CDATA[<p>Hallo,</p>
<p>die Frage ist eigentlich falsch gestellt.<br />
Angenommen ich habe folgende Klasse:</p>
<p>class Test</p>
<pre><code class="language-cpp">{
private:
	int x;

public:
	int&amp; operator- (void) {
		return - this-&gt;x;
	}	
};
</code></pre>
<p>Im Falle, dass dein Objekt negiert wird, so wird der negierte Wert von x zurückgeliefert. Ich würde aber gerne auch bei der einfachen Verwendung eines Objekts dieser Klasse den aktuellen Wert von &quot;x&quot; zurückliefern.</p>
<p>Also so:</p>
<pre><code class="language-cpp">int main()
{
	Test t;

	cout &lt;&lt; t &lt;&lt; endl;	// soll &quot;x&quot; zurückliefern
}
</code></pre>
<p>Mir ist klar, dass normalerweiße bei der Verwendung von &quot;t&quot; die Speicheradresse zurückgeliefert wird. Die Frage daher, ob man diesen &quot;Operator&quot;(?) überschreiben kann ...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/249891/kann-eine-klasse-einen-rückgabewert-haben</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 06:03:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/249891.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Sep 2009 17:09:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Sun, 13 Sep 2009 17:09:44 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>die Frage ist eigentlich falsch gestellt.<br />
Angenommen ich habe folgende Klasse:</p>
<p>class Test</p>
<pre><code class="language-cpp">{
private:
	int x;

public:
	int&amp; operator- (void) {
		return - this-&gt;x;
	}	
};
</code></pre>
<p>Im Falle, dass dein Objekt negiert wird, so wird der negierte Wert von x zurückgeliefert. Ich würde aber gerne auch bei der einfachen Verwendung eines Objekts dieser Klasse den aktuellen Wert von &quot;x&quot; zurückliefern.</p>
<p>Also so:</p>
<pre><code class="language-cpp">int main()
{
	Test t;

	cout &lt;&lt; t &lt;&lt; endl;	// soll &quot;x&quot; zurückliefern
}
</code></pre>
<p>Mir ist klar, dass normalerweiße bei der Verwendung von &quot;t&quot; die Speicheradresse zurückgeliefert wird. Die Frage daher, ob man diesen &quot;Operator&quot;(?) überschreiben kann ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777720</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Sun, 13 Sep 2009 17:09:44 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Sun, 13 Sep 2009 17:15:58 GMT]]></title><description><![CDATA[<p>Was du machen kannst, ist ein Konvertierungsoperator:</p>
<pre><code class="language-cpp">class MyClass
{
    private:
        int value;
    public:
        operator int() const
        {
            return value;
        }
};
</code></pre>
<p>Jedoch solltest du vorsichtig sein, da du damit recht viel Typsicherheit verlierst. In jedem Kontext, in dem ein <code>int</code> erwartet wird, kannst du ein Objekt deiner Klasse einsetzen - das hat auch ein gewisses Fehlerpotential. Mach wenn möglich eine Konvertierungsfunktion wie <code>int GetInt() const</code> oder so. Zur Ausgabe kannst du ja den Stream-Operator &lt;&lt; überladen, dann kannst du deine Klasse ebenso mit <code>cout</code> nutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777727</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 13 Sep 2009 17:15:58 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Sun, 13 Sep 2009 17:21:04 GMT]]></title><description><![CDATA[<p>Die Adresse wird bestimmt nicht zurückgegeben, das endet bestenfalls mit einem Kompilierfehler. Dein Negierungsoperator finde ich auch nicht schön. Negiere doch einfach nur das Attribut und gibt *this zurück, man erwartet beim Negieren ja das selbe Objekt und kein Int. Außerdem ist es eine Referenz, man kann also den Member von außerhalb verändern, nicht schön, deshalb immer const-Referenzen von Membern zurückgeben. <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>
<p>Du willst für deine Klasse den <code>operator &lt;&lt;()</code> überladen. Als Parameter 1 brauchst du ein <code>ostream</code> -Objekt, etwa cout. Und als zweiten Parameter die Klasse. Der Operator muss global sein und gleichzeitig Attributzugriff haben. Deshalb verwendet man da <code>friend</code></p>
<pre><code class="language-cpp">class Test {
private:
    int x;

public:
    Test&amp; operator- (void) {
        x = -x;
        return *this;
    }

    friend ostream&amp; operator &lt;&lt;(ostream &amp;os, const Test &amp;t);  
};

ostream&amp; operator &lt;&lt;(ostream &amp;os, const Test &amp;t) {
   os &lt;&lt; t.x;
   return os;
}
</code></pre>
<p>Referenzrückgabe, damit man mehrere Ts hinternander ausgeben kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777729</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sun, 13 Sep 2009 17:21:04 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Sun, 13 Sep 2009 18:00:00 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Die Adresse wird bestimmt nicht zurückgegeben, das endet bestenfalls mit einem Kompilierfehler. Dein Negierungsoperator finde ich auch nicht schön. Negiere doch einfach nur das Attribut und gibt *this zurück, man erwartet beim Negieren ja das selbe Objekt und kein Int. Außerdem ist es eine Referenz, man kann also den Member von außerhalb verändern, nicht schön, deshalb immer const-Referenzen von Membern zurückgeben. <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>
<p>Du willst für deine Klasse den <code>operator &lt;&lt;()</code> überladen. Als Parameter 1 brauchst du ein <code>ostream</code> -Objekt, etwa cout. Und als zweiten Parameter die Klasse. Der Operator muss global sein und gleichzeitig Attributzugriff haben. Deshalb verwendet man da <code>friend</code></p>
</blockquote>
<p>ähm, okay <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>
<p>Du hast mich so falsch verstanden, wie es nur irgendwie möglich gewesen wäre.</p>
<p>1. Ich habe oben stehende Klasse nur mal so schnell dahin geschrieben. Sie hat nichts damit zu tun, warum ich das wissen will. Ich wollte nur einfach mein Problem verdeutlichen.<br />
2. Ich möchte die Klasse als eine Art Typ verwenden. Daher erwarte ich beim negieren schon einen &quot;int&quot; (in diesem Beispiel) und nicht die Klasse selbst.<br />
3. Man soll das Objekt von außen verändern sollen. Die Implementierung hier ist aber Zufall.</p>
<p>Punkt 2 ist der wichtigste. Ich will eine Art neuen Typ deklarieren. Daher würde ich gerne eine Instanz der Klasse auch direkt als Typ verwenden können.<br />
Die Überladung des Typs habe ich auch schon in Betracht gezogen und scheint die beste Lösung zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777769</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Sun, 13 Sep 2009 18:00:00 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Sun, 13 Sep 2009 18:03:13 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>2. Ich möchte die Klasse als eine Art Typ verwenden. Daher erwarte ich beim negieren schon einen &quot;int&quot; (in diesem Beispiel) und nicht die Klasse selbst.</p>
</blockquote>
<p>Eine Klasse ist immer ein Typ, egal mit welcher Semantik du sie vollpackst. Die Folgerung (&quot;Daher erwarte...&quot;) verstehe ich trotzdem nicht. Wieso willst du einerseits einen autonomen Typen, andererseits eine Konvertierung zu <code>int</code> , einem ganz anderen Typen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Für einen eigenständigen Typen ist es wohl das beste, du überlädst die Operatoren sinnvoll. Das heisst, sie geben wieder Objekte der Klasse zurück und nicht <code>int</code> oder sowas.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777771</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 13 Sep 2009 18:03:13 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Sun, 13 Sep 2009 18:42:29 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Eine Klasse ist immer ein Typ, egal mit welcher Semantik du sie vollpackst. Die Folgerung (&quot;Daher erwarte...&quot;) verstehe ich trotzdem nicht. Wieso willst du einerseits einen autonomen Typen, andererseits eine Konvertierung zu <code>int</code> , einem ganz anderen Typen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Für einen eigenständigen Typen ist es wohl das beste, du überlädst die Operatoren sinnvoll. Das heisst, sie geben wieder Objekte der Klasse zurück und nicht <code>int</code> oder sowas.</p>
</blockquote>
<p>Du hast grundsätzlich natürlich recht. Ich habe evtl. Schwierigkeiten mich auszudrücken. Ich habe mal etwas zusammengetragen:</p>
<p>Angenommen wir möchten eine Klasse bilden die einen BCD-Typen bereitstellt. Dann möchte ich diese genau so verwenden können (wie ich es jetzt auch tun werde):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;math.h&gt;
using namespace std;

class BCD 
{
private:
	char*	_num;

public:
	BCD( void ) {
		this-&gt;_num = new char[6]();
		memset( this-&gt;_num, 48, 6 );
	}

	BCD( int num ) {
		this-&gt;_num = new char[6]();
		memset( this-&gt;_num, 48, 6 );
		this-&gt;reset(num);
	}

	void reset( int num ) {
		char* tmp = new char[5]();

		_itoa_s( num, tmp, 5, 10 );

		if( num &gt; 0 ) {
			this-&gt;_num[0] = 48;
			memcpy( &amp;this-&gt;_num[6-strlen(tmp)], tmp, 5-strlen(tmp) );
		}
		else {
			this-&gt;_num[0] = 49;
			memcpy( &amp;this-&gt;_num[7-strlen(tmp)], &amp;tmp[1], 6-strlen(tmp) );
		}

		delete[] tmp;
	}

	operator int (void) {
		int  tmp = 0;
		char c;

		for( int i = 5; i &gt; 0; i-- ) {
			c = this-&gt;_num[i]; 
			tmp += atoi(&amp;c) * pow((double)10, (5-i)); 
		}

		if( this-&gt;_num[0] == 48 )
			return tmp;
		else
			return -tmp;
	}

	int operator[] (unsigned char idx) {
		if( idx &lt;= 5 ) {
			char c = this-&gt;_num[5 - idx];
			return atoi(&amp;c);
		}
	}
};

int main()
{
	BCD bcd = -42;

	cout &lt;&lt; bcd &lt;&lt; endl;
	cout &lt;&lt; bcd[0] &lt;&lt; endl;
	cout &lt;&lt; bcd[1] &lt;&lt; endl;

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1777795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777795</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Sun, 13 Sep 2009 18:42:29 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Sun, 13 Sep 2009 19:26:43 GMT]]></title><description><![CDATA[<p>Auweia.</p>
<p>1. Warum new? Du kannst das Array doch direkt speichern. Viel besser so.</p>
<p>2. Ich sehe den Sinn der Klasse nicht. Sie speichert ja eigentlich nur einen String. BCD heißt &quot;binary coded decimal&quot;. Damit verbinde ich, dass in einem Oktett zwei Ziffern kodiert werden, also eine Ziffer je 4 Bit. Das ist zumindest üblich, wenn man von BCD spricht. Es sei denn, ich irre mich hier total. Wie auch immer. Du legst eine Klasse an, nur um eine Ganzzahl anders zu repräsentieren. Wozu? Rechne doch mit int und wandel dann in std::string um, wenn Du es brauchst.</p>
<p>3. Du hast die 3er-Regel nicht beachtet --&gt; Speicherleck, Doppel-Löschung, etc. Hab ich schon gesagt, dass viel zu viel <code>new</code> bei Dir im Quellcode steht?</p>
<p>Was die implizite Konvertierung angeht. Das könnte man so machen:</p>
<pre><code class="language-cpp">class BCD {
  static const int len = 6;
  char ziffern[len];
public:
  // impliziter Konstruktor (für implizite int-&gt;BCD Konvertierung)
  BCD(int);             

  // implizite BCD-&gt;int Konvertierung
  operator int() const;

  BCD&amp; operator+=(BCD const&amp;);
  BCD&amp; operator-=(BCD const&amp;);
  BCD&amp; operator*=(BCD const&amp;);
  BCD&amp; operator/=(BCD const&amp;);
  BCD&amp; operator++();
  BCD&amp; operator--();

  BCD operator+() const;
  BCD operator-() const;
  BCD operator++(int);
  BCD operator--(int);
};

inline BCD operator+(BCD const&amp; a, BCD const&amp; b)
{ BCD ret = a; ret += b; return ret; }

...
</code></pre>
<p>Viel Spaß beim Überladen der Operatoren. Es gibt dann ja auch noch ==, !=, &lt;, &lt;=, &gt;, &gt;=. Vielleicht findest Du auch eine sinvolle Bedeutung für &amp;, |, ^, ~. <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>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777818</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sun, 13 Sep 2009 19:26:43 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Mon, 14 Sep 2009 07:03:33 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Auweia.</p>
<p>1. Warum new? Du kannst das Array doch direkt speichern. Viel besser so.</p>
<p>2. Ich sehe den Sinn der Klasse nicht. Sie speichert ja eigentlich nur einen String. BCD heißt &quot;binary coded decimal&quot;. Damit verbinde ich, dass in einem Oktett zwei Ziffern kodiert werden, also eine Ziffer je 4 Bit. Das ist zumindest üblich, wenn man von BCD spricht. Es sei denn, ich irre mich hier total. Wie auch immer. Du legst eine Klasse an, nur um eine Ganzzahl anders zu repräsentieren. Wozu? Rechne doch mit int und wandel dann in std::string um, wenn Du es brauchst.</p>
<p>3. Du hast die 3er-Regel nicht beachtet --&gt; Speicherleck, Doppel-Löschung, etc. Hab ich schon gesagt, dass viel zu viel <code>new</code> bei Dir im Quellcode steht</p>
</blockquote>
<p>Guten Morgen,</p>
<p>mmmh,ich habe doch extra geschrieben, dass ich nur mal so etwas &quot;zusammengetragen&quot; habe. Ich habe einfach mal zwei Minuten Zeit genommen und habe etwas geschrieben, damit man sieht wie ich dass jetzt mit der operator-überladung lösen möchte.</p>
<p>Ansonsten hast du natürlich recht. BCD bedeutet &quot;binary coded decimal&quot; und genau dass soll die Klasse ja auch machen. Aber dafür brauche ich dann schon etwas mehr als zwei Minuten für die volle Implementierung.</p>
<p>Dass es hier Blödsinn ist mit new speicher zu holen (den ich dann auch nicht wieder freigebe) ist mir klar. Aber wie gesagt: Ich wollte eigentlich nur kurz zeigen wie ich dass mit dem Operator mache.</p>
<p>Dass ich ziemlich viele Operatoren überladen muss ist mir klar. Wie würdest du es denn implementieren?</p>
<p>Es ist ja eigentlich recht einfach. Ich nehme einen unsigned char für zwei Zahlen ...</p>
<p>Ich hatte es mir so gedacht:</p>
<p>Angenommen wir wollen die Zahl 42 BCD speichern.</p>
<pre><code class="language-cpp">unsigned char c;

__asm {
[asm]    lea	edx, c
    xor ax, ax

    mov ah, 4
    shr ax, 4

    add al, 2

    mov byte ptr [edx], al[/asm]
}
</code></pre>
<p>oder so:</p>
<pre><code class="language-cpp">unsigned char c1;
c1 = 4 &lt;&lt; 4;
c1 += 2;

cout &lt;&lt; static_cast&lt;int&gt;(c1) &lt;&lt; endl;
</code></pre>
<p>oder gar so:</p>
<pre><code class="language-cpp">struct bcd {
	unsigned char z1:4;
	unsigned char z2:4;
} c2 = { 2, 4 };

void* p = &amp;c2;

cout &lt;&lt; *(reinterpret_cast&lt;unsigned char*&gt;(p)) &lt;&lt; endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1777965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777965</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Mon, 14 Sep 2009 07:03:33 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Mon, 14 Sep 2009 07:11:35 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Wie würdest du es denn implementieren?</p>
</blockquote>
<p>Gar nicht. Ich sehe keinen Sinn darin, eine BCD-Klasse zu erstellen. Wozu soll das gut sein? Wie der Wert intern repräsentiert wird, interessiert doch keine Sau. Das, was Du damit machen kannst, schon. Das einzige, was Du angedeutet hast, und was BCD mehr können muss als ein <code>int</code> , ist das Extrahieren von Ziffern. Dafür kann man aber recht leicht eine Funktion schreiben.</p>
<pre><code class="language-cpp">int ziffer(int zahl, int index);
</code></pre>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Angenommen wir wollen die Zahl 42 BCD speichern.</p>
</blockquote>
<p>Warum?</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">unsigned char c;

__asm {
[asm]    lea	edx, c
    xor ax, ax

    mov ah, 4
    shr ax, 4

    add al, 2

    mov byte ptr [edx], al[/asm]
}
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> Sieht falsch, kompliziert und nicht portabel aus.</p>
<pre><code class="language-cpp">unsigned char c = 0x42;
</code></pre>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>oder gar so:</p>
<pre><code class="language-cpp">struct bcd {
	unsigned char z1:4;
	unsigned char z2:4;
} c2 = { 2, 4 };

void* p = &amp;c2;

cout &lt;&lt; *(reinterpret_cast&lt;unsigned char*&gt;(p)) &lt;&lt; endl;
</code></pre>
</blockquote>
<p>Pfui! Böse! Es sei denn, Du willst, dass es nicht portabel ist.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777990</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 14 Sep 2009 07:11:35 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Mon, 14 Sep 2009 07:50:29 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Sieht falsch, kompliziert und nicht portabel aus.</p>
</blockquote>
<p>Nur bedingt portabel: Ja.<br />
Falsch: Nein.</p>
<p>Ich sehe ja ein, dass die Assembler-Variante nicht portabel ist; ist ja auch logisch. Aber was genau magst du an der letzten Variante nicht? Ich denke es ist die einfachste und eleganteste Lösung (man bedenke, dass es sich um eine Veranschaulichung und keine vollständige Implementierung handelt).</p>
<p>Der Grund warum ich eine bcd-Klasse möchte ist der, dass ich bcd-Werte in einer Datei speichern möchte. Ich dachte mir, dass es komfortabler und verständlicher ist, wenn ich dafür einen Typ deklariere, der die Daten gleich auch so hält.</p>
<p>Ich glaube du hast mal wieder nicht verstanden, wofür ich dass hier machen will - könnte daran liegen, dass ich es vorher nicht gesagt habe <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>
<p>Wir brauchen nicht darüber reden, dass es totaler Schwachsinn wäre, einen Klasse zu bauen, die im Endeffekt einen Integer repräsentatiert, aber die Daten intern anders speichert. Denn das interessiert wirklich keine Sau ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778004</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Mon, 14 Sep 2009 07:50:29 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Mon, 14 Sep 2009 07:55:00 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Der Grund warum ich eine bcd-Klasse möchte ist der, dass ich bcd-Werte in einer Datei speichern möchte. Ich dachte mir, dass es komfortabler und verständlicher ist, wenn ich dafür einen Typ deklariere, der die Daten gleich auch so hält.</p>
</blockquote>
<p>Wenn es echt nur ums Speichern geht, dann operator&lt;&lt; und glücklich sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778005</guid><dc:creator><![CDATA[jomei]]></dc:creator><pubDate>Mon, 14 Sep 2009 07:55:00 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Mon, 14 Sep 2009 08:07:34 GMT]]></title><description><![CDATA[<p>Ich denke er weiß, dass er mit dem &lt;&lt; Operator relativ leicht speichern kann, aber er will halt die BCD Funktionalität an sich und die Laden/Speichern-Funktionalität sauber in einer Klasse zusammen haben. Irgendwo nachvollziehbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778014</guid><dc:creator><![CDATA[It0101]]></dc:creator><pubDate>Mon, 14 Sep 2009 08:07:34 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Mon, 14 Sep 2009 08:10:58 GMT]]></title><description><![CDATA[<p>Im Prinzip geht es nur ums speichern, weil es wie gesagt keinen Sinn macht nach Außen einen Integer zu repräsentieren und nur intern die Werte anders zu halten.</p>
<p>Aber ich wollte schon, dass man mit dem Typ auch rechnen kann. Ist eigentlich auch keine zu große Schwierigkeit denke ich.</p>
<p>It0101 schrieb:</p>
<blockquote>
<p>Ich denke er weiß, dass er mit dem &lt;&lt; Operator relativ leicht speichern kann, aber er will halt die BCD Funktionalität an sich und die Laden/Speichern-Funktionalität sauber in einer Klasse zusammen haben. Irgendwo nachvollziehbar.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Wenigstens einer versteht mich <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>
<p>Ich möchte nicht den Umstand haben immer wieder die Dateien zu speicher / laden und dann das Gelesene nicht richtig verwenden zu können.</p>
<p>Zudem brauche ich auch noch eine Implementierung für Excess-3, weshalb sich eine saubere abstrakte Klasse anbietet. Ist zwar mehr Arbeit, hat man aber mehr von.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778015</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Mon, 14 Sep 2009 08:10:58 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Mon, 14 Sep 2009 08:51:50 GMT]]></title><description><![CDATA[<p>Ich bin auch so ein Ordnungsfreak wie du <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Ich weiß zwar nicht genau was letztendlich alles in die Klasse rein soll, aber rein für BCD-Funktionalität würdest du die Klasse sicher nicht entwickeln und ich auch nicht.</p>
<p>Ich würde das mit den Operatoren aber vermutlich trotzdem nicht machen... ich würde das einfach über Memberfunktionen abhandeln. Ist zwar dann von der Verwendung nicht so schön wie Operatoren, entspricht aber mehr meiner Sicht einer Klasse.</p>
<p>Aber am Ende musst du selbst entscheiden, mit welcher Umsetzung du dich am wohlsten fühlst, egal was andere dazu sagen.</p>
<p>Im allgemeinen empfiehlt es sich aber, aber die Experten hier zu hören. Auch wenn man es nur ungern wahr haben will, haben die Jungs meistens recht ( <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: außer bei returns in der int main(...) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778027</guid><dc:creator><![CDATA[It0101]]></dc:creator><pubDate>Mon, 14 Sep 2009 08:51:50 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Mon, 14 Sep 2009 09:29:19 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Sieht falsch, kompliziert und nicht portabel aus.</p>
</blockquote>
<p>Nur bedingt portabel: Ja.<br />
Falsch: Nein.</p>
</blockquote>
<p>__asm ist Compiler-spezifisch. Auch wenn Du dem GCC das auf einem x86 zu futtern gibst: Er will es nicht.</p>
<pre><code class="language-asm">xor ax, ax  // AX = 0x0000
mov ah, 4   // AX = 0x0400
shr ax, 4   // AX = 0x0040
add al, 2   // AX = 0x0042
</code></pre>
<p>Ok, hast recht. <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>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ich sehe ja ein, dass die Assembler-Variante nicht portabel ist;</p>
</blockquote>
<p>Sie ist nicht nur nicht portabel sondern auch relativ unangebracht. Dort stand keine Operation, die Du nicht auch in C oder C++ hättest schreiben können. Es kommt mir fast so vor, als hättest Du das nur geschrieben, um zu demonstrieren, dass Du &quot;Assembler kannst&quot;.</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Aber was genau magst du an der letzten Variante nicht?</p>
</blockquote>
<p>Jedem Compiler ist es selbst überlassen, wie er Bitfelder anordnet. Du verlässt Dich also auf ein Verhalten Deines Compilers, welches nicht vom C++ Standard garantiert wird.</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ich denke es ist die einfachste und eleganteste Lösung.</p>
</blockquote>
<p>Das sehe ich nicht so. Du brauchst keine BCD-Klasse.</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Der Grund warum ich eine bcd-Klasse möchte ist der, dass ich bcd-Werte in einer Datei speichern möchte.</p>
</blockquote>
<p>Schön, dass Du das auch mal erwähnst! Aber ich sehe immer noch nicht, warum Du dafür eine Klasse anlegen musst.</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ich dachte mir, dass es komfortabler und verständlicher ist, wenn ich dafür einen Typ deklariere, der die Daten gleich auch so hält.</p>
</blockquote>
<p>Nicht wirklich. Wie so ein Objekt im Speicher repräsentiert wird, ist relativ uninteressant für den Benutzer. Die Schnittstelle ist viel interessanter. Du kannst in Deinem BCD-Objekt auch die Zahl einfach als int speichern. Warum nicht? Es hat keinen zu interessieren, wie das Objekt intern aufgebaut wird. (Geheimnisprinzip)</p>
<p>Du brauchst nur Funktionen zum Kodieren und Dekodieren. ZB so was:</p>
<pre><code class="language-cpp">/// speichert eine vorzeichenlose Zahl im BCD-Format
/// (&quot;little endian&quot;)
void bcd_encode(unsigned zahl, unsigned char* ziel, int oct_count)
{
  for (int k=0; k&lt;oct_count; ++k) {
    const unsigned rest = zahl % 100;
    ziel[k] = ((rest / 10) &lt;&lt; 4) | (rest % 10);
    zahl /= 100;
  }
}
</code></pre>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ich glaube du hast mal wieder nicht verstanden,</p>
</blockquote>
<p>mal wieder? Hmm...</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>wofür ich dass hier machen will - könnte daran liegen, dass ich es vorher nicht gesagt habe <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>
</blockquote>
<p>Richtig erkannt. Und auch jetzt, wo Du es gesagt hast, frage ich mich, wieso Du eine Klasse namens BCD implementieren willst.</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Wir brauchen nicht darüber reden, dass es totaler Schwachsinn wäre, einen Klasse zu bauen, die im Endeffekt einen Integer repräsentatiert, aber die Daten intern anders speichert. Denn das interessiert wirklich keine Sau ...</p>
</blockquote>
<p>Mit anderen Worten, Du willst Dich nicht davon abbringen lassen, ein Problem umständlich zu lösen. Nur zu!</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778043</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 14 Sep 2009 09:29:19 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Mon, 14 Sep 2009 09:45:03 GMT]]></title><description><![CDATA[<p>Der Assembler war mein erster Gedankengang. Ich bin ein Querdenker, habe aber recht schnell eingesehen, dass es nicht unbedingt die schönste Lösung ist.</p>
<p>Dein Code ist ganz gut. Ich finde es nur wenig schön die Oktetts angeben zu müssen.</p>
<p>Du hast natürlich recht, ich &quot;brauche&quot; keine bcd-Klasse. Ich halte es jedoch für leichter im Umgang, wenn ich eine solche Implementieren würde. Welche Schnittstellen die wie hat, muss ich mir allerdings nochmal reichlich überlegen.</p>
<p>Ich glaube mich erinnern zu kommen, dass Borland C++ sogar eine bcd-Header mit einer bcd-Klasse hatte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778049</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Mon, 14 Sep 2009 09:45:03 GMT</pubDate></item><item><title><![CDATA[Reply to Kann eine Klasse einen Rückgabewert haben? on Mon, 14 Sep 2009 12:07:25 GMT]]></title><description><![CDATA[<p>Falls du doch einmal in die Verlegenheit kommst, die Operatoren zu überladen, lohnt sich ein Blick in die Artikel von pumuckl (<a href="http://magazin.c-plusplus.net/artikel/%DCberladung%20von%20Operatoren%20in%20CPlusPlus%20%28Teil%201%29" rel="nofollow">Link zum ersten Artikel</a>). Besonders wenn du Boost hast, kannst du dir so viel Redundanz sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778161</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 14 Sep 2009 12:07:25 GMT</pubDate></item></channel></rss>