<?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[class::*]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in einem Forum folgenden Code gesehen:</p>
<pre><code class="language-cpp">class D
{

};

class C
{
public:
	char szPointerSize_0x4; // 4
};

class B : public C, public D // Size would only be 0x4 with 1 inherited class
{
public:
	char szPointerSize_0x8; // 8
};

class A : virtual public B // Size would only be 0x8 if it I removed virtual
{
public:
	char szPointerSize_0xC; // 12
};

int main()
{
	size_t APtr = sizeof(unsigned long(A::*)());
	size_t BPtr = sizeof(unsigned long(B::*)());
	size_t CPtr = sizeof(unsigned long(C::*)());

	printf(&quot;A: %d\nB: %d\n C: %d\n&quot;, APtr, BPtr, CPtr);

	return 0;
}
</code></pre>
<p>Dabei geht es um die Größe von &quot;member function pointers&quot;. Kann mir jemand erklären, warum da 4, 8, 12 rauskommt? Ich denke das klärt sich von selbst, wenn mir jemand erklärt, was &quot;unsigned long(A::*)()&quot; macht. <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>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305331/class</link><generator>RSS for Node</generator><lastBuildDate>Sun, 09 Aug 2026 01:09:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305331.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Jun 2012 13:40:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to class::* on Tue, 26 Jun 2012 13:40:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in einem Forum folgenden Code gesehen:</p>
<pre><code class="language-cpp">class D
{

};

class C
{
public:
	char szPointerSize_0x4; // 4
};

class B : public C, public D // Size would only be 0x4 with 1 inherited class
{
public:
	char szPointerSize_0x8; // 8
};

class A : virtual public B // Size would only be 0x8 if it I removed virtual
{
public:
	char szPointerSize_0xC; // 12
};

int main()
{
	size_t APtr = sizeof(unsigned long(A::*)());
	size_t BPtr = sizeof(unsigned long(B::*)());
	size_t CPtr = sizeof(unsigned long(C::*)());

	printf(&quot;A: %d\nB: %d\n C: %d\n&quot;, APtr, BPtr, CPtr);

	return 0;
}
</code></pre>
<p>Dabei geht es um die Größe von &quot;member function pointers&quot;. Kann mir jemand erklären, warum da 4, 8, 12 rauskommt? Ich denke das klärt sich von selbst, wenn mir jemand erklärt, was &quot;unsigned long(A::*)()&quot; macht. <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>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227376</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Tue, 26 Jun 2012 13:40:38 GMT</pubDate></item><item><title><![CDATA[Reply to class::* on Tue, 26 Jun 2012 15:15:49 GMT]]></title><description><![CDATA[<p>Weil Member Function Pointers unter MSVC broken sind. Der Standard sagt in 5.2.10.10, dass _alle_ mfps ineinander umwandelbar sein müssen, auch wenn der Aufruf undefiniert ist. Das impliziert, dass die Dinger die selbe Größe haben müssen (Da Rückumwandlungen wieder den ursprünglichen mfp ergeben sollen).</p>
<p>Unter GCC dürfte für alle 8 rauskommen, somit standardkonform.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227424</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Tue, 26 Jun 2012 15:15:49 GMT</pubDate></item><item><title><![CDATA[Reply to class::* on Tue, 26 Jun 2012 15:35:40 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Der Standard sagt in 5.2.10.10, dass _alle_ mfps ineinander umwandelbar sein müssen, auch wenn der Aufruf undefiniert ist. Das impliziert, dass die Dinger die selbe Größe haben müssen (Da Rückumwandlungen wieder den ursprünglichen mfp ergeben sollen).</p>
</blockquote>
<p>Das ist ein Grund. Der andere liegt darin, dass Zeiger auf Member(-funktionen) für noch nicht definierte Klassen gebildet werden können. Ändert man das Beispiel etwas ab</p>
<pre><code class="language-cpp">class A;
unsigned long(A::*foo)();

..
class A : virtual public B
..
    size_t APtr = sizeof(foo);
</code></pre>
<p>wird das Problem noch auf andere Weise deutlich.</p>
<p>Bei MSVC muss man solche Konstrukte also entweder vermeiden oder besser mit geeigneten Compileroptionen (/vmx oder so ähnlich, wenn mich mein Gedächtnis nicht täuscht) arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227432</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227432</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 26 Jun 2012 15:35:40 GMT</pubDate></item><item><title><![CDATA[Reply to class::* on Tue, 26 Jun 2012 16:57:44 GMT]]></title><description><![CDATA[<p>was bedeutet denn A::*?</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227468</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Tue, 26 Jun 2012 16:57:44 GMT</pubDate></item><item><title><![CDATA[Reply to class::* on Tue, 26 Jun 2012 17:08:36 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>was bedeutet denn A::*?</p>
</blockquote>
<p><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="😕"
    /> Das ist ein Pointer auf eine Memberfunktion. Also das worum sich dein ganzer Thread dreht.</p>
<p>Genauer:</p>
<pre><code class="language-cpp">unsigned long(A::*)()
</code></pre>
<p>Das ist ein Zeiger auf eine Memberfunktion der Klasse A, die keine Parameter annimmt und einen unsigned long zurück gibt.</p>
<p>Vielleicht ist es so klarer:</p>
<pre><code class="language-cpp">unsigned long(A::*my_pointer)();
</code></pre>
<p>Dies definiert my_pointer als einen Zeiger auf eine Memberfunktion der Klasse A, die keine Parameter annimmt und einen unsigned long zurück gibt.</p>
<p>Da oben keine Variablen definiert wurden, sondern die Größe dieser Typen gesucht wurde, wurde auch kein Name für den Pointer angegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227473</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 26 Jun 2012 17:08:36 GMT</pubDate></item><item><title><![CDATA[Reply to class::* on Tue, 26 Jun 2012 20:22:02 GMT]]></title><description><![CDATA[<p>ok danke<br />
mir war nicht klar, dass man da einfach deb Namen weglassen kann</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227539</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Tue, 26 Jun 2012 20:22:02 GMT</pubDate></item><item><title><![CDATA[Reply to class::* on Tue, 26 Jun 2012 21:08:54 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>ok danke<br />
mir war nicht klar, dass man da einfach deb Namen weglassen kann</p>
</blockquote>
<p>Das ist wie der Unterschied zwischen</p>
<pre><code class="language-cpp">sizeof(int);
</code></pre>
<p>und</p>
<pre><code class="language-cpp">int i;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2227565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227565</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 26 Jun 2012 21:08:54 GMT</pubDate></item></channel></rss>