<?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[this-Pointer aus Oberklasse]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>habe folgendes Problem und zwar geht es um folgenden Code</p>
<pre><code class="language-cpp">class A
{
  public:

    A() {x = 1;}

    A* foo()
    {
      return this;  
    }

    int x;

};

class B : public A
{
  public:

    B() {x = 2;}

    int x;
};

int main()
{
  B b;
  cout &lt;&lt; b.foo()-&gt;x &lt;&lt; endl; 

  return 0;
}
</code></pre>
<p>Was ich hier gerne hätte ist, dass eine 2 auf der Konsole ausgegeben wird und nicht eine 1.</p>
<p>Was mir jetzt als erste Lösung einfällt ist, die Funtion foo in B einfach mit dem richtigen Rückgabetyp zu überschreiben (auch das &quot;this&quot; würde dann auf das richtige Objekt, nämlich das der aufrufenden Unterklasse B, zeigen)</p>
<pre><code class="language-cpp">class A
{
  public:

    A() {x = 1;}

    A* foo()
    {
      return this;  
    }

    int x;

};

class B : public A
{
  public:

    B() {x = 2;}

    B* foo()
    {
      return this;  
    }

    int x;
};

int main()
{
  B b;
  cout &lt;&lt; b.foo()-&gt;x &lt;&lt; endl; 

  return 0;
}
</code></pre>
<p>Aber vllt kennt jemand von euch noch eine elegantere Lösung. Kann man irgendwie als Rückgabetyp der Funtion foo in der Klasse A gerade den des aufrufenden Objekts wählen, d.h. wenn ein Objekt der Unterklasse B die Funktion foo ihrer Oberklasse A aufruft, soll der Rückgabewert von &quot;foo&quot; B* sein und &quot;this&quot; soll auch auf B zeigen.</p>
<p>Gruß <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/topic/305617/this-pointer-aus-oberklasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 14:35:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305617.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Jul 2012 15:38:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to this-Pointer aus Oberklasse on Tue, 03 Jul 2012 15:38:04 GMT]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>habe folgendes Problem und zwar geht es um folgenden Code</p>
<pre><code class="language-cpp">class A
{
  public:

    A() {x = 1;}

    A* foo()
    {
      return this;  
    }

    int x;

};

class B : public A
{
  public:

    B() {x = 2;}

    int x;
};

int main()
{
  B b;
  cout &lt;&lt; b.foo()-&gt;x &lt;&lt; endl; 

  return 0;
}
</code></pre>
<p>Was ich hier gerne hätte ist, dass eine 2 auf der Konsole ausgegeben wird und nicht eine 1.</p>
<p>Was mir jetzt als erste Lösung einfällt ist, die Funtion foo in B einfach mit dem richtigen Rückgabetyp zu überschreiben (auch das &quot;this&quot; würde dann auf das richtige Objekt, nämlich das der aufrufenden Unterklasse B, zeigen)</p>
<pre><code class="language-cpp">class A
{
  public:

    A() {x = 1;}

    A* foo()
    {
      return this;  
    }

    int x;

};

class B : public A
{
  public:

    B() {x = 2;}

    B* foo()
    {
      return this;  
    }

    int x;
};

int main()
{
  B b;
  cout &lt;&lt; b.foo()-&gt;x &lt;&lt; endl; 

  return 0;
}
</code></pre>
<p>Aber vllt kennt jemand von euch noch eine elegantere Lösung. Kann man irgendwie als Rückgabetyp der Funtion foo in der Klasse A gerade den des aufrufenden Objekts wählen, d.h. wenn ein Objekt der Unterklasse B die Funktion foo ihrer Oberklasse A aufruft, soll der Rückgabewert von &quot;foo&quot; B* sein und &quot;this&quot; soll auch auf B zeigen.</p>
<p>Gruß <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/2229707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229707</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Tue, 03 Jul 2012 15:38:04 GMT</pubDate></item><item><title><![CDATA[Reply to this-Pointer aus Oberklasse on Tue, 03 Jul 2012 15:56:10 GMT]]></title><description><![CDATA[<p>Ich denke das geht nicht, aber was willst du eigentlich erreichen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229709</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 03 Jul 2012 15:56:10 GMT</pubDate></item><item><title><![CDATA[Reply to this-Pointer aus Oberklasse on Tue, 03 Jul 2012 18:12:35 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28870">@MatheStein</a><br />
C++ ist statisch typisiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229747</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 03 Jul 2012 18:12:35 GMT</pubDate></item><item><title><![CDATA[Reply to this-Pointer aus Oberklasse on Tue, 03 Jul 2012 20:36:58 GMT]]></title><description><![CDATA[<p>Mal abgesehen von der Frage, warum du nicht nur eine x-Variable nimmst: Du kannst auch einem virtuelle GetX() und SetX()-Funktion schreiben, statt foo() virtuell zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229792</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Tue, 03 Jul 2012 20:36:58 GMT</pubDate></item><item><title><![CDATA[Reply to this-Pointer aus Oberklasse on Tue, 03 Jul 2012 20:40:41 GMT]]></title><description><![CDATA[<p>Man kann es auch mit CRTP lösen. Vorher sollte man aber nochmal rekapitulieren, ob es im konkreten Fall nicht bessere Lösungen gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229794</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Tue, 03 Jul 2012 20:40:41 GMT</pubDate></item><item><title><![CDATA[Reply to this-Pointer aus Oberklasse on Tue, 03 Jul 2012 20:56:18 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Man kann es auch mit CRTP lösen. Vorher sollte man aber nochmal rekapitulieren, ob es im konkreten Fall nicht bessere Lösungen gibt.</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="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229802</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 03 Jul 2012 20:56:18 GMT</pubDate></item><item><title><![CDATA[Reply to this-Pointer aus Oberklasse on Tue, 03 Jul 2012 21:19:41 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Man kann es auch mit CRTP lösen.</p>
</blockquote>
<p>Könntest du das mal kurz andeutungsweise demonstrieren? So einen Gedanken hatte ich auch, aber hab keinen Ansatz gefunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229812</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 03 Jul 2012 21:19:41 GMT</pubDate></item><item><title><![CDATA[Reply to this-Pointer aus Oberklasse on Tue, 03 Jul 2012 21:56:58 GMT]]></title><description><![CDATA[<p>Ich werde jetzt wahrscheinlich Meilenweit vorbeischießen, aber es sieht so offensichtlich aus:</p>
<pre><code class="language-cpp">template&lt;typename fooT&gt;
class A
{
  public:

    A() {x = 1;}

    fooT* foo()
    {
      return dynamic_cast&lt;fooT*&gt;(this);
    }

    int x;

};

class B : public A&lt;B&gt;
{
  public:

    B() {x = 2;}

    B* foo()
    {
      return this;
    }

    int x;
};
</code></pre>
<p>Wenn das die Antwort wäre: Schade, dass <code>static_assert/enable_if</code> nicht gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229821</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 03 Jul 2012 21:56:58 GMT</pubDate></item><item><title><![CDATA[Reply to this-Pointer aus Oberklasse on Tue, 03 Jul 2012 22:37:47 GMT]]></title><description><![CDATA[<p>Bei CRTP verwendet man üblicherweise static_cast.</p>
<p>Ansonsten... möglicherweise ist es das was der OP will. Es ist allerdings strenggenommen nicht das wonach er gefragt hat - schliesslich gibt es dabei keine Klasse &quot;A&quot; mehr, nur mehr eine Klasse &quot;A&lt;B&gt;&quot;. Wenn wir dann C von B ableiten sind wir wieder wo wir angefangen haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229830</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 03 Jul 2012 22:37:47 GMT</pubDate></item><item><title><![CDATA[Reply to this-Pointer aus Oberklasse on Wed, 04 Jul 2012 07:46:34 GMT]]></title><description><![CDATA[<p>Ja, das ist nicht ganz das, was ich mir vorgestellt hatte. Das foo in B ist wahrscheinlich nur ein Flüchtigkeitsfehler, aber dass A jetzt mit der konkreten Subklasse parametrisiert wird ... wenn dann muss foo ein Funktionstemplate sein. Und das geht halt nicht, weil man das implizite Argument nicht &quot;zu fassen&quot; kriegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229878</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 04 Jul 2012 07:46:34 GMT</pubDate></item><item><title><![CDATA[Reply to this-Pointer aus Oberklasse on Wed, 04 Jul 2012 11:20:57 GMT]]></title><description><![CDATA[<p>Achja, man könnte das ganze natürlich auch gleich so machen...</p>
<pre><code class="language-cpp">class A 
{ 
public: 
    A() { x_ = 1; }

    virtual int&amp; x() { return x_; } 

    int x_;
}; 

class B : public A 
{ 
public: 

    B() { x_ = 2; }

    virtual int&amp; x() { return x_; } 

    int x_;
}; 

int main() 
{ 
   B b; 
   cout &lt;&lt; b.x() &lt;&lt; endl; 

   return 0; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2229978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229978</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 04 Jul 2012 11:20:57 GMT</pubDate></item><item><title><![CDATA[Reply to this-Pointer aus Oberklasse on Wed, 04 Jul 2012 11:36:10 GMT]]></title><description><![CDATA[<p>Man kann eine Menge machen, wenn man nicht weiß, welches Problem der OP eigentlich genau lösen will. Man kann aufgrund des abseitigen Designs auch nicht die üblichen Standardrandbedingungen annehmen. Von dem was er schreibt gehört zu den Randbedingungen aber: Die Methode darf nicht in der abgeleiteten Klasse redefiniert werden.</p>
<p>Meine Überlegung war folgendermaßen: Wäre foo eine freie Funktion(stemplate), dann könnte man es so machen:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
T* foo(T&amp; t) {
  return &amp;t;
}

B b;
foo(b)-&gt;x
</code></pre>
<p>Soweit, so trivial. Geht das ganze auch als Memberfunktion? Nein, obwohl bei nichtvirtuellen Memberfunktionen <code>b.foo()</code> im Grunde nichts anderes als <code>foo(&amp;b)</code> ist, da der Typ, mit dem das Template parametrisiert ist, der Typ des impliziten this-Arguments und damit nicht (syntaktisch) zugänglich ist.</p>
<pre><code class="language-cpp">class A { ...
template&lt;class T&gt;
T* foo(/* T* this ??? */)
{
  return static_cast&lt;T*&gt;(this);
}
</code></pre>
<p>Irgendwie widerspricht das meinem Schönheitsempfinden <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/2229985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229985</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 04 Jul 2012 11:36:10 GMT</pubDate></item></channel></rss>