<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>using do_line in a class</title>
		<link>http://www.allegro.cc/forums/view/588137</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 21 Oct 2006 00:49:50 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve defined a class, and within that I&#39;m trying to use the do_line function, passing one of the methods of that class as the supplied function. However, when I try, the compiler complains with:</p><div class="source-code snippet"><div class="inner"><pre>argument of type `<span class="k1">void</span> <span class="k2">(</span>class::<span class="k2">)</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span>, <span class="k1">int</span>, <span class="k1">int</span>, <span class="k1">int</span><span class="k2">)</span><span class="s">' does not match `void (*)(BITMAP*, int, int, int)'</span>
</pre></div></div><p>

Is there a way of using a class&#39;s method in do_line?</p><p>Jeroen
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HardTranceFan)</author>
		<pubDate>Fri, 20 Oct 2006 10:56:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> Bob <span class="k2">{</span>
public:
  <span class="k1">virtual</span> <span class="k1">void</span> draw_line_callback_in_class1<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span> <span class="k2">{</span>
  <span class="k2">}</span>
<span class="k2">}</span><span class="k2">;</span>

<span class="k1">void</span> draw_line_callback_helper_1<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp, <span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> d<span class="k2">)</span> <span class="k2">{</span>
  Bob <span class="k3">*</span>bob <span class="k3">=</span> <span class="k2">(</span>Bob<span class="k3">*</span><span class="k2">)</span>d<span class="k2">;</span><span class="c">//only valid if sizeof(int) &gt;= sizeof(void*)</span>
  <span class="c">//if sizeof(int) is &lt; sizeof(void*) you might try having a table of sime kind to look up which Bob you want in using d</span>
  <span class="c">//if you need more parameters, instead of going for a Bob you could go for an intermediate object that contained a Bob* and something else</span>
  <span class="k2">(</span><span class="k2">(</span>Bob<span class="k3">*</span><span class="k2">)</span>d<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>draw_line_callback_in_class1<span class="k2">(</span>bmp, x, y<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>

...
<a href="http://www.allegro.cc/manual/do_line" target="_blank"><span class="a">do_line</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, SCREEN_W-1, SCREEN_H-2, <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>bob_ptr, draw_line_callback_helper_1<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
Not the best way of doing things, but it works on most 32 bit compilers.  I think some people create templates to replace the helper function.  Also, if you don&#39;t need a &#39;this&#39; pointer, you can declare the in-class callback as static and then you can do away with the helper.  See the comments for ideas on what to do on 64 bit compilers or other circumstances.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Fri, 20 Oct 2006 14:03:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey Orz,</p><p>Your solution worked a treat. Thanks <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>Jeroen
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HardTranceFan)</author>
		<pubDate>Sat, 21 Oct 2006 00:09:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">// in header file</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="k1">class</span> Bob <span class="k2">{</span></td></tr><tr><td class="number">4</td><td>public:</td></tr><tr><td class="number">5</td><td>  <span class="k1">virtual</span> <span class="k1">void</span> draw_line_callback_in_class1<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">6</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">7</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td><span class="c">// ... in some source file</span></td></tr><tr><td class="number">10</td><td><span class="k1">static</span> <span class="k1">int</span> bobPtrsIndex <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td><span class="k1">static</span> Bob <span class="k3">*</span>bobPtrs<span class="k2">[</span><span class="n">5</span><span class="k2">]</span><span class="k2">;</span> <span class="c">// Allows max 5 threads accessing callback at once</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td><span class="k1">void</span> draw_line_callback_helper_1<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp, <span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> d<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">14</td><td>  </td></tr><tr><td class="number">15</td><td>  bobPtrs<span class="k2">[</span>d<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>draw_line_callback_in_class1<span class="k2">(</span>bmp, x, y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td><span class="k2">}</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td><span class="c">// ... in some method</span></td></tr><tr><td class="number">19</td><td><span class="k1">int</span> i <span class="k3">=</span> bobPtrsIndex<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>bobPtrs<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> <span class="k1">this</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td><a href="http://www.allegro.cc/manual/do_line" target="_blank"><span class="a">do_line</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, SCREEN_W-1, SCREEN_H-2, i, draw_line_callback_helper_1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td><span class="k3">-</span><span class="k3">-</span>bobPtrsIndex<span class="k2">;</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Sat, 21 Oct 2006 00:49:50 +0000</pubDate>
	</item>
</rss>
