<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>working with allegro datatypes in c++</title>
		<link>http://www.allegro.cc/forums/view/592304</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 18 Jul 2007 02:12:12 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve noticed that I can&#39;t have a bitmap or allegro datatype contained within a class.  or at least  whenever I try it I get &quot;c++ iso standards forbid&quot; compile errors.</p><p>Am i missing a way to do this or is it impossible in allegro?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (relay01)</author>
		<pubDate>Sun, 15 Jul 2007 11:59:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I&#39;ve noticed that I can&#39;t have a bitmap or allegro datatype contained within a class.
</p></div></div><p>
The hell you can&#39;t. Post code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (23yrold3yrold)</author>
		<pubDate>Sun, 15 Jul 2007 12:06:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
The hell you can&#39;t. Post code.
</p></div></div><p>
okay</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>&#160;</td></tr><tr><td class="number">2</td><td><span class="k1">class</span> Sprite</td></tr><tr><td class="number">3</td><td><span class="k2">{</span></td></tr><tr><td class="number">4</td><td>  public:</td></tr><tr><td class="number">5</td><td>    Sprite<span class="k2">(</span><span class="k1">int</span> pos_x, <span class="k1">int</span> pos_y, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> sprit<span class="k2">)</span><span class="k2">;</span> <span class="c">//Single Image Type Sprite</span></td></tr><tr><td class="number">6</td><td>    Sprite<span class="k2">(</span><span class="k1">int</span> pos_x, <span class="k1">int</span> pos_y, <a href="http://www.allegro.cc/manual/DATAFILE" target="_blank"><span class="a">DATAFILE</span></a><span class="k3">*</span> datf<span class="k2">)</span><span class="k2">;</span> <span class="c">//multiimage type sprite</span></td></tr><tr><td class="number">7</td><td>   </td></tr><tr><td class="number">8</td><td>    <span class="k1">int</span> update_pos<span class="k2">(</span><span class="k1">int</span> pos_x, <span class="k1">int</span> pos_y<span class="k2">)</span><span class="k2">;</span>      <span class="c">//for sprites with no collide information just position</span></td></tr><tr><td class="number">9</td><td>    <span class="k1">int</span> update_pos<span class="k2">(</span>Collision <span class="k3">&amp;</span> spr_collide, <span class="k1">int</span> pos_x, <span class="k1">int</span> pos_y<span class="k2">)</span><span class="k2">;</span> <span class="c">//for sprites with collide information</span></td></tr><tr><td class="number">10</td><td>    </td></tr><tr><td class="number">11</td><td>    <span class="k1">int</span> draw<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="k3">&amp;</span>buffer, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> image<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>    <span class="k1">int</span> draw<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="k3">&amp;</span>buffer,<a href="http://www.allegro.cc/manual/DATAFILE" target="_blank"><span class="a">DATAFILE</span></a><span class="k3">*</span> datafile, <span class="k1">int</span> number<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>    </td></tr><tr><td class="number">14</td><td>    <span class="k1">int</span> set_animation<span class="k2">(</span><span class="k1">int</span> startframe, <span class="k1">int</span> endframe<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>    <span class="k1">int</span> animate<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="k3">&amp;</span>buffer, <a href="http://www.allegro.cc/manual/DATAFILE" target="_blank"><span class="a">DATAFILE</span></a><span class="k3">*</span>datafile<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>    </td></tr><tr><td class="number">17</td><td>    <a href="http://www.allegro.cc/manual/DATAFILE" target="_blank"><span class="a">DATAFILE</span></a><span class="k3">*</span> datafile <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>   private:</td></tr><tr><td class="number">20</td><td>      </td></tr><tr><td class="number">21</td><td>    <span class="c">//Sprite dimension information</span></td></tr><tr><td class="number">22</td><td>    <span class="k1">int</span> x_pos<span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    <span class="k1">int</span> y_pos<span class="k2">;</span></td></tr><tr><td class="number">24</td><td>    <span class="k1">int</span> width<span class="k2">;</span></td></tr><tr><td class="number">25</td><td>    <span class="k1">int</span> height<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>    </td></tr><tr><td class="number">27</td><td>    <span class="k1">int</span> is_image<span class="k2">;</span>  <span class="c">//0 if datafile 1 if image type sprite</span></td></tr><tr><td class="number">28</td><td>    </td></tr><tr><td class="number">29</td><td>    <span class="c">//collision related information</span></td></tr><tr><td class="number">30</td><td>    <span class="k1">int</span> place_in_collision_vector<span class="k2">;</span> <span class="c">//keeps track of this particular sprites place in the collision vector</span></td></tr><tr><td class="number">31</td><td>    <span class="k1">int</span> added_to_vector<span class="k2">;</span>  <span class="c">//if this sprite is part of a vector type Collision model, this is changed to 1</span></td></tr><tr><td class="number">32</td><td>    <span class="k1">int</span> collision_is_vector<span class="k2">;</span> <span class="c">//tracker for collision model</span></td></tr><tr><td class="number">33</td><td>    </td></tr><tr><td class="number">34</td><td>     <span class="c">//animation related data values</span></td></tr><tr><td class="number">35</td><td>    <span class="k1">int</span> current_frame<span class="k2">;</span>  <span class="c">//frame that sprite is currently on</span></td></tr><tr><td class="number">36</td><td>    <span class="k1">int</span> start_frame<span class="k2">;</span> <span class="c">//frame that sprite starts with</span></td></tr><tr><td class="number">37</td><td>    <span class="k1">int</span> end_frame<span class="k2">;</span> <span class="c">//frame that sprite ends with</span></td></tr><tr><td class="number">38</td><td><span class="k2">}</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>

when compiled will give the ISO C++ error...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (relay01)</author>
		<pubDate>Sun, 15 Jul 2007 12:13:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Depends what it forbids. Does it forbid using it before it&#39;s declared? Do you include allegro.h before that header? I think winalleg.h might cause a funny conflict like that too ...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (23yrold3yrold)</author>
		<pubDate>Sun, 15 Jul 2007 12:26:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/DATAFILE" target="_blank"><span class="a">DATAFILE</span></a><span class="k3">*</span> datafile <span class="k3">=</span> NULL<span class="k2">;</span>
</pre></div></div><p>
You can&#39;t do that. The = cannot be used in that fashion for classes. You must use constructors instead.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> MyClass
<span class="k2">{</span>
  public:
    <a href="http://www.allegro.cc/manual/DATAFILE" target="_blank"><span class="a">DATAFILE</span></a> <span class="k3">*</span>mydata<span class="k2">;</span>
    MyClass<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>

MyClass::MyClass<span class="k2">(</span><span class="k2">)</span>
<span class="k2">{</span>
  mydata <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Also, this is more stylistic than necessary, but you normally do not put the variable names in the declaration of functions (only the variable type is necessary). Leave that for the definitions.</p><p>EDIT:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> draw<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="k3">&amp;</span>buffer, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> image<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
You also shouldn&#39;t use * and &amp; at the same time...It&#39;s either one or the other. In this case, you want to use * because you will be passing a pointer.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elverion)</author>
		<pubDate>Sun, 15 Jul 2007 12:41:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Anything that tells you what the class is, goes in the .hpp file, and in the <tt>class</tt> structure. Anything that does stuff, goes in the .cpp file, and not in the <tt>class</tt> structure. (unless you want it inlined)</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Also, this is more stylistic than necessary, but you normally do not put the variable names in the declaration of functions (only the variable type is necessary). Leave that for the definitions.
</p></div></div><p>

I disagree with this. Since the header file is generally your reference for how to use the class, wouldn&#39;t it be helpful to have descriptive parameter names to make it clear how it should be used?</p><p>This:</p><p><span class="source-code"><span class="k1">int</span> draw<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="k3">&amp;</span>, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k2">)</span><span class="k2">;</span></span></p><p>certainly tells you less about the function than this:</p><p><span class="source-code"><span class="k1">int</span> draw<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="k3">&amp;</span>buffer, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> image<span class="k2">)</span><span class="k2">;</span></span></p><p>The only time I don&#39;t name my parameters is when a function is to never be used. For example:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> DoNotCopy
<span class="k2">{</span>
private:
    DoNotCopy<span class="k2">(</span><span class="k1">const</span> DoNotCopy<span class="k3">&amp;</span><span class="k2">)</span><span class="k2">;</span>
    ...
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>

Also, to echo Elverion, there are a few instances where you would want to pass a pointer by reference. This, however, is most likely not one of them. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Sun, 15 Jul 2007 13:12:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
You can&#39;t do that. The = cannot be used in that fashion for classes. You must use constructors instead.
</p><div class="source-code snippet"><div class="inner"><pre>MyClass::MyClass<span class="k2">(</span><span class="k2">)</span>
<span class="k2">{</span>
  mydata <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div></div><p>
It&#39;s actually better to use 0 instead of NULL in C++, and it&#39;s better to set the initial value in the constructor list, like so:
</p><div class="source-code snippet"><div class="inner"><pre>MyClass::MyClass<span class="k2">(</span><span class="k2">)</span> <span class="k2">:</span> mydata<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>
<span class="k2">{</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Archon)</author>
		<pubDate>Sun, 15 Jul 2007 14:16:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>i appreciate the responses... it appears to be working just as long as I don&#39;t set the value to anything... If anybody wants overtime... I&#39;d like some advice on creating a copy constructor...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (relay01)</author>
		<pubDate>Tue, 17 Jul 2007 07:26:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Copy constructors are in the form of:</p><p><span class="source-code">Example<span class="k2">(</span><span class="k1">const</span> Example<span class="k3">&amp;</span> other<span class="k2">)</span></span></p><p>All classes have a default copy constructor that is genoratored by the compiler based on the member fields. If I have a class like this:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> Example
<span class="k2">{</span>
private:
    <span class="k1">int</span> x<span class="k2">;</span>
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>

The compiler tacks on this code, among other things:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> Example
<span class="k2">{</span>
private:
    <span class="k1">int</span> x<span class="k2">;</span>

public:
    Example<span class="k2">(</span><span class="k1">const</span> Example<span class="k3">&amp;</span> other<span class="k2">)</span>
    <span class="k2">:</span>   x<span class="k2">(</span>other.x<span class="k2">)</span>
    <span class="k2">{</span><span class="k2">}</span>
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>

So when we do this:</p><div class="source-code snippet"><div class="inner"><pre>Example a<span class="k2">;</span>
Example b<span class="k2">(</span>a<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

b now has the same value of x as a.</p><p>So what you want to do is write a constructor that takes a reference-to-const of another instance of the same class as a parameter. Then you want to do whatever is necessary to enforce a predictable behavior from the copy constructor.</p><p>For most cases, the default constructor should be fine. But sometimes, you have certain concepts of ownership that have to be communicated or special consideration has to be taken because of the contained types.</p><p>Side-note: Also, if a contained type has no copy constructor -- perhaps it has been disallowed by making it private, you must specify your own because the compiler cannot do it for you.</p><p>Back to ownership/special consideration...<br />Consider this class:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">class</span> Bitmap</td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>private:</td></tr><tr><td class="number">4</td><td>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> m_bmp<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>public:</td></tr><tr><td class="number">7</td><td>    Bitmap<span class="k2">(</span><span class="k1">const</span> std::string<span class="k3">&amp;</span> _path<span class="k2">)</span></td></tr><tr><td class="number">8</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">9</td><td>        m_bmp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span>_path.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>m_bmp <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="s">"Haha, no bitmap loaded!"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>    Bitmap<span class="k2">(</span><span class="k1">const</span> Bitmap<span class="k3">&amp;</span> _other<span class="k2">)</span></td></tr><tr><td class="number">14</td><td>    <span class="k2">:</span>   m_bmp<span class="k2">(</span>_other.m_bmp<span class="k2">)</span></td></tr><tr><td class="number">15</td><td>    <span class="k2">{</span><span class="k2">}</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>    ~Bitmap<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">18</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">19</td><td>        <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>m_bmp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">21</td><td><span class="k2">}</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>

Looks fine, right?</p><p> <b>NOOOOOO!!!!!</b></p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="k2">{</span>
    Bitmap a<span class="k2">(</span><span class="s">"my bitmap.bmp"</span><span class="k2">)</span><span class="k2">;</span>   <span class="c">//ok, make a new Bitmap</span>
    <span class="k2">{</span>                            <span class="c">//open a new scope</span>
        Bitmap b<span class="k2">(</span>a<span class="k2">)</span><span class="k2">;</span>             <span class="c">//ok, copy the bitmap from a</span>
    <span class="k2">}</span>
    <span class="c">//PROBLEM: b has gone out of scope and the destructor has been called</span>
    <span class="c">//Therefore, m_bmp no longer exists!</span>
    a.DoStuff<span class="k2">(</span><span class="k2">)</span>   <span class="c">//this will then crash</span>
<span class="k2">}</span>
</pre></div></div><p>

So we need a copy constructor like this:</p><div class="source-code snippet"><div class="inner"><pre>Bitmap::Bitmap<span class="k2">(</span><span class="k1">const</span> Bitmap<span class="k3">&amp;</span> _other<span class="k2">)</span>
<span class="k2">:</span>   m_bmp<span class="k2">(</span><a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span>_other.m_bmp-&gt;w, _other.m_bmp-&gt;h<span class="k2">)</span><span class="k2">)</span>
<span class="k2">{</span>
    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>_other.m_bmp, m_bmp, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, _other.m_bmp-&gt;w, _other.m_bmp-&gt;h<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Of course, this is a shallow solution. A robust solution would keep a count of references to the bitmap, like boost::shared_ptr, or boost::intrusive_ptr, and delete it when nobody else needs it. But this would be too much code to write to demonstrate a simple concept. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Tue, 17 Jul 2007 09:25:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Kibiz0r, thank you for helping me avoid a HUGE bug.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (relay01)</author>
		<pubDate>Wed, 18 Jul 2007 00:34:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If that saved you trouble, try this:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">class</span> Bitmap</td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>private:</td></tr><tr><td class="number">4</td><td>    <span class="k1">class</span> BmpWrapper</td></tr><tr><td class="number">5</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">6</td><td>    private:</td></tr><tr><td class="number">7</td><td>        BmpWrapper<span class="k2">(</span><span class="k1">const</span> BmpWrapper<span class="k3">&amp;</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>        BmpWrapper<span class="k3">&amp;</span> <span class="k1">operator</span><span class="k3">=</span><span class="k2">(</span><span class="k1">const</span> BmpWrapper<span class="k3">&amp;</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>        <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> m_bmp<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td>    public:</td></tr><tr><td class="number">13</td><td>        BmpWrapper<span class="k2">(</span><span class="k1">const</span> std::string<span class="k3">&amp;</span> _path<span class="k2">)</span></td></tr><tr><td class="number">14</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">15</td><td>            m_bmp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span>_path.c_str<span class="k2">(</span><span class="k2">)</span>, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>            <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>m_bmp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>        ~BmpWrapper<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">20</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">21</td><td>            <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>m_bmp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">23</td><td>    <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td>    boost::shared_ptr<span class="k3">&lt;</span>BmpWrapper&gt; m_pBmp<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</td><td>public:</td></tr><tr><td class="number">28</td><td>    Bitmap<span class="k2">(</span><span class="k1">const</span> std::string<span class="k3">&amp;</span> _path<span class="k2">)</span></td></tr><tr><td class="number">29</td><td>    <span class="k2">:</span>   m_pBmp<span class="k2">(</span><span class="k1">new</span> BmpWrapper<span class="k2">(</span>_path<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">30</td><td>    <span class="k2">{</span><span class="k2">}</span></td></tr><tr><td class="number">31</td><td><span class="k2">}</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>

The default copy constructor and operator= will work as expected because of the semantics of boost::shared_ptr. When all the shared_ptrs that reference the same BmpWrapper are gone, the BITMAP* will be destroyed. This way avoids the memory overhead and CPU time of constantly copying BITMAPs, but is still safe.</p><p>Note that boost::shared_ptr uses shallow reference counting, which is stored in the boost::shared_ptr itself. So if you make two instances of Bitmap which have the same path, you will have two copies of the same Bitmap. Only copy construction and operator= give you an all-access pass to the wonderful world of managed memory.</p><p>You can get around that using boost::intrusive_ptr, but then you have to have some central repository of BmpWrappers that are probably organized by a hash of the path string, and you have to define a few functions that Boost needs to use in order to know when to delete them, etc... it&#39;s a lot of work to save a handful of KB.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Wed, 18 Jul 2007 02:12:12 +0000</pubDate>
	</item>
</rss>
