<?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[Problem mit Voklards c++ Kurs]]></title><description><![CDATA[<p>Hi,</p>
<p>ich versuche gerade Volkards c++ Kurs zu verstehen. Ich bin in Lektion 60.<br />
<a href="http://www.iks.hs-merseburg.de/~kilian/ak_Dateien/ak_lehre_Dateien/2009_WS/Bioinformatik_VL/Lehrmaterial/C++/Kurs%20Volkhard%20Henkel/html/die_klasse_vector.html" rel="nofollow">http://www.iks.hs-merseburg.de/~kilian/ak_Dateien/ak_lehre_Dateien/2009_WS/Bioinformatik_VL/Lehrmaterial/C++/Kurs Volkhard Henkel/html/die_klasse_vector.html</a><br />
Ich habe Probleme das mit dem L-Wert zu verstehen.</p>
<p>Soweit ich verstanden habe ist ein L-Wert ein Wert dem etwas zugewiesen werden darf.</p>
<p>Nun hat die Klasse &quot;Vector&quot; den Opertaor [] überladen mit</p>
<pre><code class="language-cpp">double operator [] (long array_index)
{
	return array_data[array_index];
}
</code></pre>
<p>.</p>
<p>Im Hauptprogramm funktioniert nun die zweite Zeile von</p>
<pre><code class="language-cpp">Vector v(10);
v[5]=4711;
std::cout&lt;&lt;v[5];
</code></pre>
<p>nicht. Das ist mir klar. Die Funktion v_[5] liefert den Wert des Arrays an der Stelle 5 zurück.</p>
<p>Ich verstehe aber nicht warum diese zweite Zeile auf einmal funktioniert wenn der Rückgabetyp des überladenden Operators in eine Referenz geändert wird also:</p>
<pre><code class="language-cpp">double&amp; operator [] (long array_index)
{
	return array_data[array_index];
}
</code></pre>
<p>Das verwirrt mich total. <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="😕"
    /><br />
Wieso kann nun einem Rückgabetyp was zugewiesen werden?</p>
<p>Ich hätte spontan versucht den Operator nochmal zu überladen, oder sowas ähnliches, damit er den Wert 4711 z.b als double annimmt.</p>
<p>Warum kann ich nun mit einer Operatorüberladung, die nur was zurückgibt einen Wert annehmen. Das ist für mich so, als ob ich eine &quot;get&quot; Methode geschrieben hätte und sie auf einmal die Funktionsweise einer &quot;set&quot; Methode kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307396/problem-mit-voklards-c-kurs</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 19:01:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307396.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 25 Aug 2012 20:05:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Voklards c++ Kurs on Sat, 25 Aug 2012 20:05:54 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich versuche gerade Volkards c++ Kurs zu verstehen. Ich bin in Lektion 60.<br />
<a href="http://www.iks.hs-merseburg.de/~kilian/ak_Dateien/ak_lehre_Dateien/2009_WS/Bioinformatik_VL/Lehrmaterial/C++/Kurs%20Volkhard%20Henkel/html/die_klasse_vector.html" rel="nofollow">http://www.iks.hs-merseburg.de/~kilian/ak_Dateien/ak_lehre_Dateien/2009_WS/Bioinformatik_VL/Lehrmaterial/C++/Kurs Volkhard Henkel/html/die_klasse_vector.html</a><br />
Ich habe Probleme das mit dem L-Wert zu verstehen.</p>
<p>Soweit ich verstanden habe ist ein L-Wert ein Wert dem etwas zugewiesen werden darf.</p>
<p>Nun hat die Klasse &quot;Vector&quot; den Opertaor [] überladen mit</p>
<pre><code class="language-cpp">double operator [] (long array_index)
{
	return array_data[array_index];
}
</code></pre>
<p>.</p>
<p>Im Hauptprogramm funktioniert nun die zweite Zeile von</p>
<pre><code class="language-cpp">Vector v(10);
v[5]=4711;
std::cout&lt;&lt;v[5];
</code></pre>
<p>nicht. Das ist mir klar. Die Funktion v_[5] liefert den Wert des Arrays an der Stelle 5 zurück.</p>
<p>Ich verstehe aber nicht warum diese zweite Zeile auf einmal funktioniert wenn der Rückgabetyp des überladenden Operators in eine Referenz geändert wird also:</p>
<pre><code class="language-cpp">double&amp; operator [] (long array_index)
{
	return array_data[array_index];
}
</code></pre>
<p>Das verwirrt mich total. <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="😕"
    /><br />
Wieso kann nun einem Rückgabetyp was zugewiesen werden?</p>
<p>Ich hätte spontan versucht den Operator nochmal zu überladen, oder sowas ähnliches, damit er den Wert 4711 z.b als double annimmt.</p>
<p>Warum kann ich nun mit einer Operatorüberladung, die nur was zurückgibt einen Wert annehmen. Das ist für mich so, als ob ich eine &quot;get&quot; Methode geschrieben hätte und sie auf einmal die Funktionsweise einer &quot;set&quot; Methode kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245477</guid><dc:creator><![CDATA[Anfänger001]]></dc:creator><pubDate>Sat, 25 Aug 2012 20:05:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Voklards c++ Kurs on Sat, 25 Aug 2012 20:11:41 GMT]]></title><description><![CDATA[<p>Einmal kriegst du eine einfache Kopie eines Wertes (wie z.B. 5). Dem kannst du natürlich nichts zuweisen.</p>
<p>Bei der Referenz kriegst du aber die Referenz auf die Variable, der du was zuweisen kannst (int x; x=5). Du greifst also auf die Variable an sich zu, wie du das mit arr[0] auch machen würdest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245479</guid><dc:creator><![CDATA[Nymer]]></dc:creator><pubDate>Sat, 25 Aug 2012 20:11:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Voklards c++ Kurs on Sat, 25 Aug 2012 21:04:12 GMT]]></title><description><![CDATA[<p>Anfänger001 schrieb:</p>
<blockquote>
<p>Die Funktion v_[5] liefert den Wert des Arrays an der Stelle 5 zurück.</p>
</blockquote>
<p>Nein, es liefert den Wert an der sechsten Stelle zurück, da bei 0 angefangen wird zu zählen. (Beliebter Anfängerfehler)</p>
<p>Anfänger001 schrieb:</p>
<blockquote>
<p>Wieso kann nun einem Rückgabetyp was zugewiesen werden?</p>
</blockquote>
<p>Der Unterschied ist der Rückgabetyp. In der ersten Funtion wird eine Kopie des wertes zurückgegeben, in der zweiten Funktion allerdings nur eine Referenz auf den Wert. Du greifst also bei dem Funktionsaufruf direkt auf den Wert in deiner Klasse zu und veränderst den Wert in der Klasse. Am besten guckst du dir nochmal allgemein Referenzen (erkennbar an dem &amp;) an, insbesondere Call-by-Value vs. Call-by-Reference, das lässt sich auf die Rückgabe von Funktionen übertragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245489</guid><dc:creator><![CDATA[Cyres]]></dc:creator><pubDate>Sat, 25 Aug 2012 21:04:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Voklards c++ Kurs on Sat, 25 Aug 2012 21:05:56 GMT]]></title><description><![CDATA[<p>Cyres schrieb:</p>
<blockquote>
<p>erkennbar an dem &amp;</p>
</blockquote>
<p>Das editierst du mal besser schnell- sonst wird er Referenzierung und Referenzen verwechseln oder gar Pointer und Referenzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245490</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 25 Aug 2012 21:05:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Voklards c++ Kurs on Sun, 26 Aug 2012 07:50:48 GMT]]></title><description><![CDATA[<p>OK, aber warum schreibt man dann z.B. getrennte get und Set methoden und nicht einfach</p>
<pre><code class="language-cpp">double&amp; getsetValue(long array_index)
{
	return array_data[array_index];
}
</code></pre>
<p>und verwendet es als get so:</p>
<pre><code class="language-cpp">int x = v.getsetValue(5);
</code></pre>
<p>und als set so</p>
<pre><code class="language-cpp">v.getsetValue(5) = 700;
</code></pre>
<p>Wäre doch praktisch nur eine Methode zu brauchen.<br />
(Obwohls komisch aussieht)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245529</guid><dc:creator><![CDATA[Anfänger001]]></dc:creator><pubDate>Sun, 26 Aug 2012 07:50:48 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Voklards c++ Kurs on Sun, 26 Aug 2012 08:04:45 GMT]]></title><description><![CDATA[<p>Anfänger001 schrieb:</p>
<blockquote>
<p>(Obwohls komisch aussieht)</p>
</blockquote>
<p>Ja, und überladene Index-Operatoren sind doch noch viel geiler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245530</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 26 Aug 2012 08:04:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Voklards c++ Kurs on Sun, 26 Aug 2012 08:05:05 GMT]]></title><description><![CDATA[<p>Weil man für Arrays o.ä. normalerweise den operator[] verwendet und dies auch beibehalten will (bzw. das verhalten imitieren will).<br />
Außerdem ist das viel weniger zu schreiben..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245531</guid><dc:creator><![CDATA[Nymer]]></dc:creator><pubDate>Sun, 26 Aug 2012 08:05:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Voklards c++ Kurs on Sun, 26 Aug 2012 08:15:13 GMT]]></title><description><![CDATA[<p>Anfänger001 schrieb:</p>
<blockquote>
<p>Wäre doch praktisch nur eine Methode zu brauchen.<br />
(Obwohls komisch aussieht)</p>
</blockquote>
<p>Das kommt auf den Anwendungsfall an. Bei std::vector gibt es zwei von den Methoden. Einmal at(size_t index) und einmal operator[](size_t index), jeweils mit einer const-Überladung. Das geht aber nicht, wenn man beim setzen der Variable eine Plausibilitätsprüfung oder andere Dinge Prüfen bzw. aufrufen muss. Deswegen sieht man eigentlich 2 Dinge sehr häufig:</p>
<pre><code class="language-cpp">class Foo {
    int bar_;

public:
    int bar() const {return bar_;}
    void bar(int bar) {bar_ = bar;} // ggf. sogar return bar_ oder return *this
                                    // damit sind Ausdrücke wie foo.bar(20).fbar(40); möglich
};
</code></pre>
<p>bzw.</p>
<pre><code class="language-cpp">class Foo {
    int bar_;

public:
    int getBar() const {return bar_;}
    void setBar(int bar) {bar_ = bar;}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2245533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245533</guid><dc:creator><![CDATA[Cyres]]></dc:creator><pubDate>Sun, 26 Aug 2012 08:15:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Voklards c++ Kurs on Sun, 26 Aug 2012 15:50:53 GMT]]></title><description><![CDATA[<p>Cyres schrieb:</p>
<blockquote>
<p>/ damit sind Ausdrücke wie foo.bar(20).fbar(40); möglich</p>
</blockquote>
<p>Meiner Ansicht nach wäre eine Elementinitialisierungsliste besser, da kann<br />
das Objekt gleich bei der Erstellung mit Werten versehen werden.</p>
<p>Zum Stichwort Elementinitialisierungsliste:<br />
<a href="http://de.wikipedia.org/wiki/Initialisierungsliste" rel="nofollow">http://de.wikipedia.org/wiki/Initialisierungsliste</a><br />
<a href="http://www.c-plusplus.net/forum/304526-full" rel="nofollow">http://www.c-plusplus.net/forum/304526-full</a></p>
<p>Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class Foo {
private:
    int bar_;
    int alter_;

public:
    int Getbar() const {return bar_;}
    void Setbar(int bar) {bar_ = bar;}

    int Getalter()const{return alter_;}
    void Setalter(int alter){alter_=alter;}

   //Elementinitialisierungsliste
    Foo(int bar=0,int alter=0):bar_(bar),alter_(alter) {}
};

int main()
{
    Foo foo(100,20);
    cout&lt;&lt;foo.Getbar()&lt;&lt;&quot; &quot;&lt;&lt;foo.Getalter()&lt;&lt;endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2245652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245652</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Sun, 26 Aug 2012 15:50:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Voklards c++ Kurs on Sun, 26 Aug 2012 15:58:58 GMT]]></title><description><![CDATA[<p>Anfänger001 schrieb:</p>
<blockquote>
<p>OK, aber warum schreibt man dann z.B. getrennte get und Set methoden und nicht einfach</p>
</blockquote>
<p>Soweit ich das weiß, sollten Funktionen möglichst einfach sein, also nur das unbedingt Notwendige enthalten.<br />
Das ermöglicht z.B. eine bessere Wartbarkeit.</p>
<p>Wenn eine Funktion mehrere Befehle enthält, man will aber nur einen davon ansprechen, muss die gesamte Funktion in den Speicher übertragen werden, man verbraucht also mehr Ressourcen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245657</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Sun, 26 Aug 2012 15:58:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Voklards c++ Kurs on Sun, 26 Aug 2012 16:04:33 GMT]]></title><description><![CDATA[<p>redrew99 schrieb:</p>
<blockquote>
<p>Soweit ich das weiß, sollten Funktionen möglichst einfach sein, also nur das unbedingt Notwendige enthalten.</p>
</blockquote>
<p>Stichwort <strong>starke Kohäsion</strong>, was aber etwas anders ist, als du es beschreibst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245662</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 26 Aug 2012 16:04:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Voklards c++ Kurs on Sun, 26 Aug 2012 20:17:19 GMT]]></title><description><![CDATA[<p>Anfänger001 schrieb:</p>
<blockquote>
<p>Wäre doch praktisch nur eine Methode zu brauchen.<br />
(Obwohls komisch aussieht)</p>
</blockquote>
<p>Es gibt auch einige Bibliotheken, die das so machen. In Sprachen wie C# ist das meines Wissens über Properties gelöst, die sich genau so verhalten. Aber sie sind letztendlich nur Syntaxzucker über separate get() und set() Methoden.<br />
Es ist hauptsächlich Konvention, dass man direkt am Namen der Methode erkennen kann, ob ein Objekt durch den Aufruf verändert werden kann oder nicht(stell dir vor, du suchst in einem Projekt mit 100.000 Zeilen Code einen Fehler und müsstest jedes mal überprüfen, ob Objekte irgendwie verändert werden...gruselig!). Wenn ich a.getValue(5) sehe, dann weiß ich, dass ich mir um den Zustand keine Sorgen machen muss, a kann nicht verändert werden. Dementsprechend sehe ich bei a.setValue(5,x) das a verändert wird und kann sofort vergleichen, ob das notwendig ist.<br />
In C++ haben wir noch einen kleinen Helfer der sich const-correctness nennt. Kurz zusammengefasst: auf konstanten Objekten können nur Methoden angewandt werden, die es nicht verändern (also const-deklariert sind). Das hilft schon in 99% der Fälle und ich könnte sowas machen:</p>
<pre><code class="language-cpp">class A{
private:
    double values[5];
public:
    double value(unsigned int index )const{
        return value[i];//const methode, value kann nur gelesen werden
    }
    double&amp; value(unsigned int index ){
        return value[i];
    }

};

A a;
a.value(4)=100;//funktioniert nur, weil a nicht konstant ist.
std::cout&lt;&lt;a.value(4); 

A const&amp; b=a;//konstante Referenz auf a
b.value(4)=200;//kompiliert nicht! b ist konstant
std::cout&lt;&lt;b.value(4);//alles super!
</code></pre>
<p>Es sieht von außen genauso aus, wie du beschrieben hast, funktioniert aber besser. Es ist aber nicht perfekt, wie du bei a siehst. Wir können gerade beide Methoden aufrufen, obwohl wir das vielleicht nicht wollen. Es könnte also sein, dass wir a aus versehen verändern, ohne dass wir es sofort merken.</p>
<p>Es gibt noch andere Gründe, aber das führt hier zu weit <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/2245756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245756</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 26 Aug 2012 20:17:19 GMT</pubDate></item></channel></rss>