<?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 this!]]></title><description><![CDATA[<p>ich hab mal ein kleines programm das vektoren multiplizieren soll gemacht, aber bei der fkt.:<br />
vektor mult(vektor v);<br />
scheint etwas nicht in ordnung zu sein, denn ich kann trotz der rückgabe, des inhalts des objekts selber, keine wertzuweisung vornehmen.</p>
<pre><code class="language-cpp">class vektor
{
      private:
              float *v;

              float x;
              float y;
              float z;

      public:
             vektor();
             vektor(vektor &amp;ref);

             vektor(float);
             vektor(float, float);
             vektor(float, float, float); 

             void definiere(float, float, float);
             void ausgabe();
             float* get_vektor();

             /*rechnen*/
             vektor mult(vektor v);
             vektor div(vektor v);
             vektor add(vektor v);
             vektor sub(vektor v);

             vektor mult(float t);
             vektor div(float t);
             vektor add(float t);
             vektor sub(float t);           
};

vektor mult(vektor &amp;v, vektor &amp;v2);
vektor div(vektor &amp;v, vektor &amp;v2);
vektor add(vektor &amp;v, vektor &amp;v2);
vektor sub(vektor &amp;v, vektor &amp;v2); 

vektor mult(vektor &amp;v, float t);
vektor div(vektor &amp;v, float t);
vektor add(vektor &amp;v, float t);
vektor sub(vektor &amp;v, float t);

vektor::vektor() : x(0), y(0), z(0) {};
vektor::vektor(vektor &amp;ref) : x(ref.x), y(ref.y), z(ref.z) {};
vektor::vektor(float rx) : x(rx), y(0), z(0) {};
vektor::vektor(float rx, float ry) : x(rx), y(ry), z(0) {};
vektor::vektor(float rx, float ry, float rz) : x(rx), y(ry), z(rz) {};

void vektor::definiere(float rx, float ry, float rz)
{
     x = rx;
     y = ry;
     z = rz;
}

void vektor::ausgabe()
{
     cout&lt;&lt;&quot;X: &quot;&lt;&lt;x&lt;&lt;endl;
     cout&lt;&lt;&quot;Y: &quot;&lt;&lt;y&lt;&lt;endl;
     cout&lt;&lt;&quot;Z: &quot;&lt;&lt;z&lt;&lt;endl;

}

float* vektor::get_vektor()
{
       v = new float[3+1];
       v[0] = x;
       v[1] = y;
       v[2] = z;
       v[3] = 4; //groeße
       return v;
       delete [] v;
}

vektor vektor::mult(vektor v)
{
     x *= v.x;
     y *= v.y;
     z *= v.z;
     return *this;
}
vektor vektor::mult(float t)
{
     x *= t;
     y *= t;
     z *= t;
     return *this;
}
vektor mult(vektor &amp;v, vektor &amp;v2)
{
       vektor v_r = v;
       v_r.mult(v2);
       return v_r;
}

int main(int argc, char *argv[])
{
    vektor temp;
    vektor a(4,1);
    vektor b(-2,-1);
    vektor c(-2,2);
    vektor d(1,-3);

    temp = a.mult(b); //mecker....
    temp.ausgabe();

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/120378/problem-mit-this</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 07:37:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/120378.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Sep 2005 15:52:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to problem mit this! on Mon, 12 Sep 2005 15:52:13 GMT]]></title><description><![CDATA[<p>ich hab mal ein kleines programm das vektoren multiplizieren soll gemacht, aber bei der fkt.:<br />
vektor mult(vektor v);<br />
scheint etwas nicht in ordnung zu sein, denn ich kann trotz der rückgabe, des inhalts des objekts selber, keine wertzuweisung vornehmen.</p>
<pre><code class="language-cpp">class vektor
{
      private:
              float *v;

              float x;
              float y;
              float z;

      public:
             vektor();
             vektor(vektor &amp;ref);

             vektor(float);
             vektor(float, float);
             vektor(float, float, float); 

             void definiere(float, float, float);
             void ausgabe();
             float* get_vektor();

             /*rechnen*/
             vektor mult(vektor v);
             vektor div(vektor v);
             vektor add(vektor v);
             vektor sub(vektor v);

             vektor mult(float t);
             vektor div(float t);
             vektor add(float t);
             vektor sub(float t);           
};

vektor mult(vektor &amp;v, vektor &amp;v2);
vektor div(vektor &amp;v, vektor &amp;v2);
vektor add(vektor &amp;v, vektor &amp;v2);
vektor sub(vektor &amp;v, vektor &amp;v2); 

vektor mult(vektor &amp;v, float t);
vektor div(vektor &amp;v, float t);
vektor add(vektor &amp;v, float t);
vektor sub(vektor &amp;v, float t);

vektor::vektor() : x(0), y(0), z(0) {};
vektor::vektor(vektor &amp;ref) : x(ref.x), y(ref.y), z(ref.z) {};
vektor::vektor(float rx) : x(rx), y(0), z(0) {};
vektor::vektor(float rx, float ry) : x(rx), y(ry), z(0) {};
vektor::vektor(float rx, float ry, float rz) : x(rx), y(ry), z(rz) {};

void vektor::definiere(float rx, float ry, float rz)
{
     x = rx;
     y = ry;
     z = rz;
}

void vektor::ausgabe()
{
     cout&lt;&lt;&quot;X: &quot;&lt;&lt;x&lt;&lt;endl;
     cout&lt;&lt;&quot;Y: &quot;&lt;&lt;y&lt;&lt;endl;
     cout&lt;&lt;&quot;Z: &quot;&lt;&lt;z&lt;&lt;endl;

}

float* vektor::get_vektor()
{
       v = new float[3+1];
       v[0] = x;
       v[1] = y;
       v[2] = z;
       v[3] = 4; //groeße
       return v;
       delete [] v;
}

vektor vektor::mult(vektor v)
{
     x *= v.x;
     y *= v.y;
     z *= v.z;
     return *this;
}
vektor vektor::mult(float t)
{
     x *= t;
     y *= t;
     z *= t;
     return *this;
}
vektor mult(vektor &amp;v, vektor &amp;v2)
{
       vektor v_r = v;
       v_r.mult(v2);
       return v_r;
}

int main(int argc, char *argv[])
{
    vektor temp;
    vektor a(4,1);
    vektor b(-2,-1);
    vektor c(-2,2);
    vektor d(1,-3);

    temp = a.mult(b); //mecker....
    temp.ausgabe();

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/870407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/870407</guid><dc:creator><![CDATA[exigoner]]></dc:creator><pubDate>Mon, 12 Sep 2005 15:52:13 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit this! on Mon, 12 Sep 2005 15:58:34 GMT]]></title><description><![CDATA[<blockquote>
<p>//mecker....</p>
</blockquote>
<p>ist natürlich sehr hilfreich...<br />
Aber naja mal was anderes wozu machst du alle operationen einaml als member und denn auch nochmal als nicht member.<br />
Afaik sollte du bei return *this;<br />
nen const vector zurückgeben .<br />
Naja ansonsten wäre ne Fehlermeldung echt toll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/870414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/870414</guid><dc:creator><![CDATA[shapeless]]></dc:creator><pubDate>Mon, 12 Sep 2005 15:58:34 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit this! on Mon, 12 Sep 2005 17:42:51 GMT]]></title><description><![CDATA[<p>komisch unter linux funktionierts?!<br />
aber wie bekomm ich sowas zum laufen?</p>
<pre><code>temp = a.mult(b.mult(2) );
</code></pre>
<p>also eine art verkettung?<br />
ich bekomm da immer</p>
<pre><code>/home/dgrat/Documents/vektor/src/vektor.cpp:136: error: no matching function for call to `vektor::vektor(vektor)'
/home/dgrat/Documents/vektor/src/vektor.cpp:77: error: candidates are: vektor::vektor(float)
/home/dgrat/Documents/vektor/src/vektor.cpp:76: error: vektor::vektor(vektor&amp;)
/home/dgrat/Documents/vektor/src/vektor.cpp:136: error: initializing argument 1 of `vektor vektor::mult(vektor)'
</code></pre>
<p>an sich liefert &quot;b.mult(2)&quot; ein ojekt vom typ vektor zurück, da müsst doch a.mult() sich mit anfreunden können <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>
]]></description><link>https://www.c-plusplus.net/forum/post/870450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/870450</guid><dc:creator><![CDATA[exigoner]]></dc:creator><pubDate>Mon, 12 Sep 2005 17:42:51 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit this! on Mon, 12 Sep 2005 18:14:59 GMT]]></title><description><![CDATA[<blockquote>
<p>an sich liefert &quot;b.mult(2)&quot; ein ojekt vom typ vektor zurück, da müsst doch a.mult() sich mit anfreunden können <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>
</blockquote>
<p>Weiß leider nicht, woran das liegt, aber wenn du schon</p>
<pre><code class="language-cpp">return *this;
</code></pre>
<p>zurückgibst, kannst du auch eine Referenz auf dein Objekt zurückgeben. =&gt;</p>
<pre><code class="language-cpp">vektor&amp; vektor::mult(float t)
{
     x *= t;
     y *= t;
     z *= t;
     return *this;
}
</code></pre>
<p>So sollte es funktionieren.</p>
<p>Btw: Folgender Code-Snippet:</p>
<pre><code class="language-cpp">...
class foo
{
   int value;
   public:
      foo(int v = 0) : value(v) {}
      foo(foo&amp; f) { this-&gt;value = f.value; }
      foo pow(foo f) { this-&gt;value = f.value * f.value; return* this; }
};

...

int main()
{
   foo obj1(9), obj2(obj1); // funktioniert

   foo obj3(obj2.pow(obj1)); // funktioniert nicht...
}
</code></pre>
<p>/edit1:<br />
Warum schmeißt die zweite Zeile den von dem OP angesprochenen Fehler? <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 wird nicht beide Male der Copy-Ctor aufgerufen? (Ist dieser Überhaupt definiert wenn ich schreibe</p>
<pre><code class="language-cpp">foo(foo&amp; f);
</code></pre>
<p>? Ich erinner mich nämlich dunkel daran, dass der Copy-Ctor so aussehen sollte</p>
<pre><code class="language-cpp">foo(const foo&amp; f);
</code></pre>
<p>... (Dann lässt sich das Beispiel auch problemlos compilieren...)))</p>
<p>Wäre nett wenn ihr mich aufklären könntet <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>/edit2: Ich glaube ich weiß woran jetzt woran das liegt: in dem Code-Snippet fungiert</p>
<pre><code class="language-cpp">foo(foo&amp; f);
</code></pre>
<p>bereits als Copy-Ctor. Dadurch kann in pow</p>
<pre><code class="language-cpp">return *this;
</code></pre>
<p>nicht in obj3 kopiert werden, da hier eine temporäres Objekt erzeugt wird, auf welche man ja bekanntlich keine nicht-const Referenzen binden kann. Ist das so korrekt? Bitte korrigiert mich, bei etwaigen Falschaussagen!</p>
<p>Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/870492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/870492</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Mon, 12 Sep 2005 18:14:59 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit this! on Mon, 12 Sep 2005 18:16:14 GMT]]></title><description><![CDATA[<p>exigoner schrieb:</p>
<blockquote>
<p>an sich liefert &quot;b.mult(2)&quot; ein ojekt vom typ vektor zurück, da müsst doch a.mult() sich mit anfreunden können <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>
</blockquote>
<p>mult liefert ein temporäres Objekt zurück, an welches eine Referenz nicht gebunden werden kann. Als Parameter wird aber genau so eine erwartet. Lösung: übergib by-value oder noch besser, per const Referenz.</p>
<p>btw:<br />
Schau dir mal an was const-correctness ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/870508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/870508</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 12 Sep 2005 18:16:14 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit this! on Mon, 12 Sep 2005 19:02:34 GMT]]></title><description><![CDATA[<p>mmh, ich merk mal hier an dass ich das (wahrscheinlich weil ich auch erkältet bin und morgen wieda schule hab) nicht so ganz verstanden hab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
es funzt aba jetzt erstmal.</p>
<blockquote>
<p>mult liefert ein temporäres Objekt zurück, an welches eine Referenz nicht gebunden werden kann. Als Parameter wird aber genau so eine erwartet. Lösung: übergib by-value oder noch besser, per const Referenz.</p>
</blockquote>
<p>darum: was meinst du mit temporären objekt genau?<br />
warum wird eine referenz als parameter gewollt?</p>
<p>referenzen hab ich ja (imho völlig sinnfrei) in den fkt. die außerhalb der klasse stehen genutzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/870536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/870536</guid><dc:creator><![CDATA[exigoner]]></dc:creator><pubDate>Mon, 12 Sep 2005 19:02:34 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit this! on Mon, 12 Sep 2005 20:25:37 GMT]]></title><description><![CDATA[<p>exigoner schrieb:</p>
<blockquote>
<blockquote>
<p>mult liefert ein temporäres Objekt zurück, an welches eine Referenz nicht gebunden werden kann. Als Parameter wird aber genau so eine erwartet. Lösung: übergib by-value oder noch besser, per const Referenz.</p>
</blockquote>
<p>darum: was meinst du mit temporären objekt genau?</p>
</blockquote>
<p>Ein temporäres Objekt ist ein (vom Compiler generiertes) Objekt, welches der Programmierer strenggenommen nie zu Gesicht bekommt.</p>
<blockquote>
<p>warum wird eine referenz als parameter gewollt?</p>
</blockquote>
<p>Warum? Weil du deinen Copy-Ctor so geschrieben hast <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="😉"
    /> Zur Erinnerung: Der Prototyp desselben sieht so aus:</p>
<pre><code class="language-cpp">vektor(vektor &amp;ref);
</code></pre>
<p>Das (imho nicht direkt ersichtliche) Problem an deinem Code ist, dass dein Copy-Ctor eine Referenz auf einen vektor-Objekt erwartet. Der Standard verbietet dir nun, dass du temporäre Objekte an nicht-konstante Referenzen binden darfst, woraus dein Fehler letztendlich resultiert. Warum das? Fragst du?<br />
Nun, was würde denn passieren wenn es erlaubt wäre Referenzen auf temporäre Objekte zu erzeugen? Dann würde folgender Code fehlerfrei übersetzt werden. (Früher wurde er es manchmal tatsächlich, weshalb es damals manchmal total verwirrt dreinblickende Programmierer gab... <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="😉"
    /> [ok, die gibt es heute auch noch...])</p>
<pre><code class="language-cpp">// gibt das Zeichen an der Position pos  von str zurück
size_t get_char_at(string&amp; str, size_t pos)
{
    if(pos &lt; str.length())
        return str[pos];
    else
        exit(1); // Fehler...
}

int main()
{
    char* c_str = &quot;Hello C++-World!&quot;;
    char c = get_char_at(c_str, 9);

}
</code></pre>
<p>Was passiert beim Aufruf von get_char_at() mit einem Argument, dass nicht vom Typ std::string ist und worauf deshalb auch keine Referenz vom Typ std::string abgebildet werden kann? Der Compiler fragt sich ungefähr folgendes: &quot;ist c_str vom Typ std::string?&quot; Nein. &quot;Kann ich c_str in ein Objekt vom Typ std::string konvertieren?&quot; Ja. Also tut dies der Compiler und erzeugt ein temporäres konstantes Objekt vom Typ std::string. Auf ein konstantes Objekt kann jetzt aber keine nicht-konstante Referenz &quot;zeigen&quot;, weshalb ein Fehler ausgegeben wird.</p>
<p>Angenommen der Compiler erzeugt kein _konstantes_ temporäres Objekt (was er ja früher tlw. getan und weswegen es früher keine Fehlermeldung gegeben haben soll), wäre es trotzdem nicht sinnvoll mit der Referenz auf dieses zu arbeiten. Jegliche Änderungen an der Referenz würden sich auf das *temporäre* Objekt beziehen und nich auf c_str...<br />
Das ist nicht das, was man erwartet, weshalb es dann auch durch den Standard verboten wurde.</p>
<p>Du fragst dich jetzt eventuell noch, was das jetzt mit deinem Problem zu tun haben soll? Als return-wert gibt eine Funktion oft ebenfalls ein temporäres Objekt zurück (so auch in deinem Fall), was zu den angesprochenen Komplikationen mit nicht-const Referenzen führt...</p>
<p>Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/870582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/870582</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Mon, 12 Sep 2005 20:25:37 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit this! on Tue, 13 Sep 2005 14:18:05 GMT]]></title><description><![CDATA[<p>erledigt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/871208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/871208</guid><dc:creator><![CDATA[exigoner]]></dc:creator><pubDate>Tue, 13 Sep 2005 14:18:05 GMT</pubDate></item></channel></rss>