<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Templated inheritance vs normal inheritance</title>
		<link>http://www.allegro.cc/forums/view/611756</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 06 Jan 2013 22:30:18 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In my game, I have a class Drawable, which is just an interface class with a few pure virtual functions. Derived from that I have an SfmlDrawable, which is never directly used, but the classes derived from SfmlDrawable are. To save myself the hassle of defining a new class for each drawable I wanted to have, I opted to do it this way:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">template</span><span class="k3">&lt;</span><span class="k1">class</span> Follow, <span class="k1">class</span> Data&gt;
<span class="number">  2</span><span class="k1">class</span> SfmlDrawable <span class="k2">:</span> <span class="k1">public</span> Drawable <span class="k2">{</span>
<span class="number">  3</span>public:
<span class="number">  4</span>    SfmlDrawable<span class="k2">(</span>Follow<span class="k3">*</span> e, std::shared_ptr<span class="k3">&lt;</span>SfData&gt; env<span class="k2">)</span> <span class="k2">:</span> entity<span class="k2">(</span>e<span class="k2">)</span>, graphics_env<span class="k2">(</span>env<span class="k2">)</span> <span class="k2">{</span>init<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  5</span>    <span class="k1">void</span> draw<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span><span class="k2">;</span> <span class="c">//Do nothing since we don't know what to draw.</span>
<span class="number">  6</span>    ... <span class="c">//Other functions</span>
<span class="number">  7</span>private:
<span class="number">  8</span>    <span class="k1">void</span> init<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span><span class="k2">;</span> <span class="c">//Initialize extra.</span>
<span class="number">  9</span>    std::shared_ptr<span class="k3">&lt;</span>SfData&gt; graphics_env<span class="k2">;</span> <span class="c">//The graphical environment</span>
<span class="number"> 10</span>    Data extra<span class="k2">;</span> <span class="c">//The extra data needed to be able to draw.</span>
<span class="number"> 11</span>    Follow<span class="k3">*</span> entity<span class="k2">;</span> <span class="c">//The entity this class represents.</span>
<span class="number"> 12</span><span class="k2">}</span>
<span class="number"> 13</span>
<span class="number"> 14</span><span class="k1">typedef</span> SfmlDrawable<span class="k3">&lt;</span>Player, sf::CircleShape&gt; SfmlPlayer<span class="k2">;</span>
<span class="number"> 15</span><span class="k1">template</span><span class="k3">&lt;</span><span class="k3">&gt;</span> <span class="k1">void</span> SfmlPlayer::draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//override the draw method</span>
<span class="number"> 16</span><span class="k1">template</span><span class="k3">&lt;</span><span class="k3">&gt;</span> <span class="k1">void</span> SfmlPlayer::init<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//override init to set the player color.</span>
<span class="number"> 17</span>... <span class="c">//Override every function that needs overriding.</span>
<span class="number"> 18</span>
<span class="number"> 19</span>... <span class="c">//Do so for every drawable.</span>
</div></div><p>
And have the implementation of the overridden functions in a .cpp file.<br />Any arguments against this or is this acceptable?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (J-Gamer)</author>
		<pubDate>Sun, 06 Jan 2013 19:45:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t know why you&#39;re doing it like this with templates. I read this earlier but I was a little stupified. It&#39;s not at all like what I have :
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span>
<span class="number">   2</span>
<span class="number">   3</span><span class="c">/*</span>
<span class="number">   4</span><span class="c"> *</span>
<span class="number">   5</span><span class="c"> *     _______       ___       ____      __       _______       _______</span>
<span class="number">   6</span><span class="c"> *    /\  ____\    /|   \     /  __\    /\ \     /\  ____\     /\  ____\</span>
<span class="number">   7</span><span class="c"> *    \ \ ___/_   ||  _ \   |  /__/____\ \ \    \ \ ___/_    \ \ _____</span>
<span class="number">   8</span><span class="c"> *     \ \  ____\  || |_\ \  |\ \ /_  _\\ \ \    \ \  ____\    \ _____ \</span>
<span class="number">   9</span><span class="c"> *      \ \ ___/_ ||  ___ \ \ \ \//\ / \ \ ____\ \ ___/_    / ____\ \</span>
<span class="number">  10</span><span class="c"> *       \ ______\||_|__/_\ \ \ _/ |   \ _____\\ ______\     /______\</span>
<span class="number">  11</span><span class="c"> *        /______/|/_/  /_/  ______/    /_____/ /______/     /______/</span>
<span class="number">  12</span><span class="c"> *</span>
<span class="number">  13</span><span class="c"> *</span>
<span class="number">  14</span><span class="c"> *    EAGLE 5</span>
<span class="number">  15</span><span class="c"> *    Edgar's Agile Gui Library and Extensions</span>
<span class="number">  16</span><span class="c"> *</span>
<span class="number">  17</span><span class="c"> *    Copyright 2009-2013+ by Edgar Reynaldo</span>
<span class="number">  18</span><span class="c"> *</span>
<span class="number">  19</span><span class="c"> *    See EagleLicense.txt for allowed uses of this library.</span>
<span class="number">  20</span><span class="c"> *</span>
<span class="number">  21</span><span class="c"> */</span>
<span class="number">  22</span>
<span class="number">  23</span>
<span class="number">  24</span>
<span class="number">  25</span><span class="p">#ifndef EagleGraphics_HPP</span>
<span class="number">  26</span><span class="p">#define EagleGraphics_HPP</span>
<span class="number">  27</span>
<span class="number">  28</span><span class="p">#include "Eagle5/EagleColor.hpp"</span>
<span class="number">  29</span><span class="p">#include "Eagle5/EagleEvents.hpp"</span>
<span class="number">  30</span><span class="p">#include "Eagle5/EagleImage.hpp"</span>
<span class="number">  31</span><span class="p">#include "Eagle5/EagleFont.hpp"</span>
<span class="number">  32</span><span class="p">#include "Eagle5/EagleContainer.hpp"</span>
<span class="number">  33</span>
<span class="number">  34</span>
<span class="number">  35</span>
<span class="number">  36</span>
<span class="number">  37</span><span class="k1">enum</span> EAGLE_DISPLAY_FLAGS <span class="k2">{</span>
<span class="number">  38</span>   EAGLE_WINDOWED                    <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">0</span>,
<span class="number">  39</span>   EAGLE_FULLSCREEN                  <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">1</span>,
<span class="number">  40</span>   EAGLE_OPENGL                      <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">2</span>,
<span class="number">  41</span>   EAGLE_DIRECT3D_INTERNAL           <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">3</span>,
<span class="number">  42</span>   EAGLE_RESIZABLE                   <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">4</span>,
<span class="number">  43</span>   EAGLE_NOFRAME                     <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">5</span>,
<span class="number">  44</span>   EAGLE_GENERATE_EXPOSE_EVENTS      <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">6</span>,
<span class="number">  45</span>   EAGLE_OPENGL_3_0                  <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">7</span>,
<span class="number">  46</span>   EAGLE_OPENGL_FORWARD_COMPATIBLE   <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">8</span>,
<span class="number">  47</span>   EAGLE_FULLSCREEN_WINDOW           <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">9</span>,
<span class="number">  48</span>   EAGLE_MINIMIZED                   <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">10</span>,
<span class="number">  49</span>   EAGLE_USE_PROGRAMMABLE_PIPELINE   <span class="k3">=</span> <span class="n">1</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">11</span>
<span class="number">  50</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  51</span>
<span class="number">  52</span>
<span class="number">  53</span><span class="k1">enum</span> IMAGE_DRAWING_FLAGS <span class="k2">{</span>
<span class="number">  54</span>   DRAW_NORMAL <span class="k3">=</span> <span class="n">0</span>,
<span class="number">  55</span>   DRAW_HFLIP <span class="k3">=</span> <span class="n">1</span>,
<span class="number">  56</span>   DRAW_VFLIP <span class="k3">=</span> <span class="n">2</span>,
<span class="number">  57</span>   DRAW_HVFLIP <span class="k3">=</span> <span class="n">3</span>
<span class="number">  58</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  59</span>
<span class="number">  60</span>
<span class="number">  61</span>
<span class="number">  62</span>
<span class="number">  63</span>
<span class="number">  64</span><span class="k1">class</span> REGION_INFO <span class="k2">{</span>
<span class="number">  65</span>   
<span class="number">  66</span><span class="k1">public</span> <span class="k2">:</span>
<span class="number">  67</span>   REGION_INFO<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>   REGION_INFO<span class="k2">(</span><span class="k1">float</span> srcx , <span class="k1">float</span> srcy , <span class="k1">float</span> srcw , <span class="k1">float</span> srch<span class="k2">)</span><span class="k2">;</span>
<span class="number">  69</span>
<span class="number">  70</span>   <span class="k1">float</span> sx<span class="k2">;</span>
<span class="number">  71</span>   <span class="k1">float</span> sy<span class="k2">;</span>
<span class="number">  72</span>   <span class="k1">float</span> sw<span class="k2">;</span>
<span class="number">  73</span>   <span class="k1">float</span> sh<span class="k2">;</span>
<span class="number">  74</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  75</span>
<span class="number">  76</span>
<span class="number">  77</span>
<span class="number">  78</span><span class="k1">class</span> SCALE_INFO <span class="k2">{</span>
<span class="number">  79</span>
<span class="number">  80</span><span class="k1">public</span> <span class="k2">:</span>
<span class="number">  81</span>   SCALE_INFO<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  82</span>   SCALE_INFO<span class="k2">(</span><span class="k1">float</span> xscale , <span class="k1">float</span> yscale<span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>
<span class="number">  84</span>   <span class="k1">float</span> x<span class="k2">;</span>
<span class="number">  85</span>   <span class="k1">float</span> y<span class="k2">;</span>
<span class="number">  86</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  87</span>
<span class="number">  88</span>
<span class="number">  89</span>
<span class="number">  90</span><span class="k1">class</span> RESIZE_INFO <span class="k2">{</span>
<span class="number">  91</span>
<span class="number">  92</span><span class="k1">public</span> <span class="k2">:</span>
<span class="number">  93</span>   RESIZE_INFO<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  94</span>   RESIZE_INFO<span class="k2">(</span><span class="k1">float</span> destx , <span class="k1">float</span> desty , <span class="k1">float</span> destw , <span class="k1">float</span> desth<span class="k2">)</span><span class="k2">;</span>
<span class="number">  95</span>   
<span class="number">  96</span>   <span class="k1">float</span> dx<span class="k2">;</span>
<span class="number">  97</span>   <span class="k1">float</span> dy<span class="k2">;</span>
<span class="number">  98</span>   <span class="k1">float</span> dw<span class="k2">;</span>
<span class="number">  99</span>   <span class="k1">float</span> dh<span class="k2">;</span>
<span class="number"> 100</span>   
<span class="number"> 101</span><span class="k2">}</span><span class="k2">;</span><span class="c">// destination rectangle</span>
<span class="number"> 102</span>
<span class="number"> 103</span>
<span class="number"> 104</span>
<span class="number"> 105</span><span class="k1">class</span> ROTATE_INFO <span class="k2">{</span>
<span class="number"> 106</span>
<span class="number"> 107</span><span class="k1">public</span> <span class="k2">:</span>
<span class="number"> 108</span>   ROTATE_INFO<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 109</span>   ROTATE_INFO<span class="k2">(</span><span class="k1">float</span> pivotx , <span class="k1">float</span> pivoty , <span class="k1">float</span> destx , <span class="k1">float</span> desty , <span class="k1">float</span> theta<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 110</span>
<span class="number"> 111</span>   <span class="k1">float</span> cx<span class="k2">;</span>
<span class="number"> 112</span>   <span class="k1">float</span> cy<span class="k2">;</span>
<span class="number"> 113</span>   <span class="k1">float</span> dx<span class="k2">;</span>
<span class="number"> 114</span>   <span class="k1">float</span> dy<span class="k2">;</span>
<span class="number"> 115</span>   <span class="k1">float</span> angle<span class="k2">;</span>
<span class="number"> 116</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 117</span>
<span class="number"> 118</span>
<span class="number"> 119</span>
<span class="number"> 120</span><span class="k1">class</span> EagleDrawingInfo <span class="k2">{</span>
<span class="number"> 121</span>
<span class="number"> 122</span><span class="k1">private</span> <span class="k2">:</span>
<span class="number"> 123</span>   <span class="k1">void</span> CheckUse<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 124</span>   
<span class="number"> 125</span><span class="k1">public</span> <span class="k2">:</span>
<span class="number"> 126</span>
<span class="number"> 127</span>   EagleDrawingInfo<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 128</span>   EagleDrawingInfo<span class="k2">(</span><span class="k1">float</span> destx , <span class="k1">float</span> desty<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 129</span>
<span class="number"> 130</span>   <span class="k1">bool</span> use_any<span class="k2">;</span>
<span class="number"> 131</span>   <span class="k1">bool</span> use_region<span class="k2">;</span>
<span class="number"> 132</span>   <span class="k1">bool</span> use_scale<span class="k2">;</span>
<span class="number"> 133</span>   <span class="k1">bool</span> use_resize<span class="k2">;</span><span class="c">// if false, destination point will be used, which is default</span>
<span class="number"> 134</span>   <span class="k1">bool</span> use_rotate<span class="k2">;</span>
<span class="number"> 135</span>   <span class="k1">bool</span> use_tint<span class="k2">;</span>
<span class="number"> 136</span>   
<span class="number"> 137</span>   <span class="k1">float</span> dx<span class="k2">;</span>
<span class="number"> 138</span>   <span class="k1">float</span> dy<span class="k2">;</span>
<span class="number"> 139</span>   
<span class="number"> 140</span>   REGION_INFO region<span class="k2">;</span><span class="c">// sx sy sw sh</span>
<span class="number"> 141</span>   SCALE_INFO scale<span class="k2">;</span><span class="c">// x y</span>
<span class="number"> 142</span>   RESIZE_INFO resize<span class="k2">;</span><span class="c">// dx dy dw dh</span>
<span class="number"> 143</span>   ROTATE_INFO rotate<span class="k2">;</span><span class="c">// cx cy dx dy angle</span>
<span class="number"> 144</span>   EagleColor tint<span class="k2">;</span><span class="c">// r g b a</span>
<span class="number"> 145</span>   <span class="k1">int</span> flags<span class="k2">;</span><span class="c">// DRAW_HFLIP DRAW_VFLIP DRAW_HVFLIP</span>
<span class="number"> 146</span>   
<span class="number"> 147</span>   <span class="k1">void</span> SetDest<span class="k2">(</span><span class="k1">float</span> x , <span class="k1">float</span> y<span class="k2">)</span><span class="k2">;</span><span class="c">// overrides resize, scale, and rotate</span>
<span class="number"> 148</span>   <span class="k1">void</span> SetRegion<span class="k2">(</span>REGION_INFO r<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 149</span>   <span class="k1">void</span> SetScale<span class="k2">(</span>SCALE_INFO s<span class="k2">)</span><span class="k2">;</span><span class="c">// only used with rotate</span>
<span class="number"> 150</span>   <span class="k1">void</span> SetResize<span class="k2">(</span>RESIZE_INFO r<span class="k2">)</span><span class="k2">;</span><span class="c">// overrides scale and rotate, latest setting wins</span>
<span class="number"> 151</span>   <span class="k1">void</span> SetRotate<span class="k2">(</span>ROTATE_INFO r<span class="k2">)</span><span class="k2">;</span><span class="c">// overrides resize</span>
<span class="number"> 152</span>   <span class="k1">void</span> SetTintColor<span class="k2">(</span>EagleColor c<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 153</span>   <span class="k1">void</span> SetFlags<span class="k2">(</span><span class="k1">int</span> f<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 154</span>
<span class="number"> 155</span>
<span class="number"> 156</span>   <span class="k1">void</span> ClearSettings<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 157</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 158</span>
<span class="number"> 159</span>
<span class="number"> 160</span>
<span class="number"> 161</span>
<span class="number"> 162</span><span class="k1">class</span> EagleGraphicsContext <span class="k2">{</span>
<span class="number"> 163</span>
<span class="number"> 164</span><span class="k1">protected</span> <span class="k2">:</span>
<span class="number"> 165</span>   <span class="k1">int</span> scrw<span class="k2">;</span>
<span class="number"> 166</span>   <span class="k1">int</span> scrh<span class="k2">;</span>
<span class="number"> 167</span>   
<span class="number"> 168</span>   EagleImage<span class="k3">*</span> backbuffer<span class="k2">;</span>
<span class="number"> 169</span>   EagleImage<span class="k3">*</span> drawing_target<span class="k2">;</span>
<span class="number"> 170</span>   
<span class="number"> 171</span>   PointerManager<span class="k3">&lt;</span>EagleImage&gt; images<span class="k2">;</span>
<span class="number"> 172</span>   PointerManager<span class="k3">&lt;</span>EagleFont&gt; fonts<span class="k2">;</span>
<span class="number"> 173</span>   
<span class="number"> 174</span>
<span class="number"> 175</span>
<span class="number"> 176</span>   
<span class="number"> 177</span><span class="k1">public</span> <span class="k2">:</span>
<span class="number"> 178</span>   EagleGraphicsContext<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 179</span>   
<span class="number"> 180</span>   <span class="k1">virtual</span> ~EagleGraphicsContext<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span>
<span class="number"> 181</span>
<span class="number"> 182</span>   <span class="c">// creation/destruction</span>
<span class="number"> 183</span>   <span class="k1">virtual</span> <span class="k1">bool</span> Create<span class="k2">(</span><span class="k1">int</span> width , <span class="k1">int</span> height , <span class="k1">int</span> flags<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 184</span>   <span class="k1">virtual</span> <span class="k1">bool</span> Valid<span class="k2">(</span><span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 185</span>   <span class="k1">virtual</span> <span class="k1">void</span> Destroy<span class="k2">(</span><span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 186</span>
<span class="number"> 187</span>   <span class="c">// clears target bitmap</span>
<span class="number"> 188</span>   <span class="k1">virtual</span> <span class="k1">void</span> Clear<span class="k2">(</span>EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 189</span>   
<span class="number"> 190</span>   <span class="c">// basic drawing operations</span>
<span class="number"> 191</span>   <span class="k1">virtual</span> <span class="k1">void</span> PutPixel<span class="k2">(</span><span class="k1">int</span> x , <span class="k1">int</span> y , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 192</span>   <span class="k1">virtual</span> <span class="k1">void</span> DrawRectangle<span class="k2">(</span><span class="k1">int</span> x , <span class="k1">int</span> y , <span class="k1">int</span> w , <span class="k1">int</span> h , <span class="k1">int</span> thickness , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 193</span>   <span class="k1">virtual</span> <span class="k1">void</span> DrawFilledRectangle<span class="k2">(</span><span class="k1">int</span> x , <span class="k1">int</span> y , <span class="k1">int</span> w , <span class="k1">int</span> h , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 194</span>   <span class="k1">virtual</span> <span class="k1">void</span> DrawCircle<span class="k2">(</span><span class="k1">int</span> cx , <span class="k1">int</span> cy , <span class="k1">int</span> radius , <span class="k1">int</span> thickness , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 195</span>   <span class="k1">virtual</span> <span class="k1">void</span> DrawFilledCircle<span class="k2">(</span><span class="k1">int</span> cx , <span class="k1">int</span> cy , <span class="k1">int</span> radius , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 196</span>   <span class="k1">virtual</span> <span class="k1">void</span> DrawTriangle<span class="k2">(</span><span class="k1">int</span> x1 , <span class="k1">int</span> y1 , <span class="k1">int</span> x2 , <span class="k1">int</span> y2 , <span class="k1">int</span> x3 , <span class="k1">int</span> y3 , <span class="k1">int</span> thickness , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 197</span>   <span class="k1">virtual</span> <span class="k1">void</span> DrawFilledTriangle<span class="k2">(</span><span class="k1">int</span> x1 , <span class="k1">int</span> y1 , <span class="k1">int</span> x2 , <span class="k1">int</span> y2 , <span class="k1">int</span> x3 , <span class="k1">int</span> y3 , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 198</span>   
<span class="number"> 199</span>   <span class="c">// precise drawing operations</span>
<span class="number"> 200</span>   <span class="k1">virtual</span> <span class="k1">void</span> PutPixel<span class="k2">(</span><span class="k1">float</span> x , <span class="k1">float</span> y , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 201</span>   <span class="k1">virtual</span> <span class="k1">void</span> DrawRectangle<span class="k2">(</span><span class="k1">float</span> x , <span class="k1">float</span> y , <span class="k1">float</span> w , <span class="k1">float</span> h , <span class="k1">float</span> thickness , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 202</span>   <span class="k1">virtual</span> <span class="k1">void</span> DrawFilledRectangle<span class="k2">(</span><span class="k1">float</span> x , <span class="k1">float</span> y , <span class="k1">float</span> w , <span class="k1">float</span> h , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 203</span>   <span class="k1">virtual</span> <span class="k1">void</span> DrawCircle<span class="k2">(</span><span class="k1">float</span> cx , <span class="k1">float</span> cy , <span class="k1">float</span> radius , <span class="k1">float</span> thickness , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 204</span>   <span class="k1">virtual</span> <span class="k1">void</span> DrawFilledCircle<span class="k2">(</span><span class="k1">float</span> cx , <span class="k1">float</span> cy , <span class="k1">float</span> radius , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 205</span>   <span class="k1">virtual</span> <span class="k1">void</span> DrawTriangle<span class="k2">(</span><span class="k1">float</span> x1 , <span class="k1">float</span> y1 , <span class="k1">float</span> x2 , <span class="k1">float</span> y2 , <span class="k1">float</span> x3 , <span class="k1">float</span> y3 , <span class="k1">float</span> thickness , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 206</span>   <span class="k1">virtual</span> <span class="k1">void</span> DrawFilledTriangle<span class="k2">(</span><span class="k1">float</span> x1 , <span class="k1">float</span> y1 , <span class="k1">float</span> x2 , <span class="k1">float</span> y2 , <span class="k1">float</span> x3 , <span class="k1">float</span> y3 , EagleColor c<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 207</span>
<span class="number"> 208</span>   <span class="c">// image drawing operations</span>
<span class="number"> 209</span>   <span class="k1">virtual</span> <span class="k1">void</span> Draw<span class="k2">(</span>EagleImage<span class="k3">*</span> src , <span class="k1">float</span> x , <span class="k1">float</span> y , <span class="k1">int</span> flags <span class="k3">=</span> DRAW_NORMAL<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 210</span><span class="c">//   virtual void Draw(EagleImage* src , EagleDrawingInfo info = EagleDrawingInfo())=0;</span>
<span class="number"> 211</span>
<span class="number"> 212</span>   <span class="c">// getters</span>
<span class="number"> 213</span>   <span class="k1">virtual</span> EagleImage<span class="k3">*</span> GetBackBuffer<span class="k2">(</span><span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 214</span>   <span class="k1">virtual</span> EagleImage<span class="k3">*</span> GetScreen<span class="k2">(</span><span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 215</span>   <span class="k1">virtual</span> EagleImage<span class="k3">*</span> GetDrawingTarget<span class="k2">(</span><span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 216</span>   
<span class="number"> 217</span>   <span class="c">// utilities</span>
<span class="number"> 218</span>   <span class="k1">virtual</span> <span class="k1">void</span> FlipDisplay<span class="k2">(</span><span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 219</span>   <span class="k1">virtual</span> <span class="k1">void</span> HoldDrawing<span class="k2">(</span><span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 220</span>   <span class="k1">virtual</span> <span class="k1">void</span> ReleaseDrawing<span class="k2">(</span><span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 221</span>   <span class="k1">virtual</span> <span class="k1">void</span> SetDrawingTarget<span class="k2">(</span>EagleImage<span class="k3">*</span> dest<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 222</span>   <span class="k1">void</span> DrawToBackBuffer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 223</span>   
<span class="number"> 224</span>   <span class="c">// image creation / loading / sub division</span>
<span class="number"> 225</span>   <span class="k1">virtual</span> EagleImage<span class="k3">*</span> CreateImage<span class="k2">(</span><span class="k1">int</span> width , <span class="k1">int</span> height , IMAGE_TYPE type<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 226</span>   <span class="k1">virtual</span> EagleImage<span class="k3">*</span> LoadImage<span class="k2">(</span>std::string file , IMAGE_TYPE type<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 227</span>   <span class="k1">virtual</span> EagleImage<span class="k3">*</span> CreateSubImage<span class="k2">(</span>EagleImage<span class="k3">*</span> parent , <span class="k1">int</span> x , <span class="k1">int</span> y , <span class="k1">int</span> width , <span class="k1">int</span> height<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 228</span>   
<span class="number"> 229</span>   <span class="c">// font loading</span>
<span class="number"> 230</span>   <span class="k1">virtual</span> EagleFont<span class="k3">*</span> LoadFont<span class="k2">(</span>std::string file , <span class="k1">int</span> height , <span class="k1">int</span> flags , IMAGE_TYPE type<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 231</span>   
<span class="number"> 232</span>   <span class="c">// event handler registration</span>
<span class="number"> 233</span>   <span class="k1">virtual</span> <span class="k1">void</span> RegisterDisplayInput<span class="k2">(</span>EagleEventHandler<span class="k3">*</span> queue<span class="k2">)</span><span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 234</span>   
<span class="number"> 235</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 236</span>
<span class="number"> 237</span>
<span class="number"> 238</span><span class="p">#endif // EagleGraphics_HPP</span>
</div></div><p>

Can you explain why you need the template, and can&#39;t simply derive new classes with out it?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 06 Jan 2013 21:39:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve seen people use templates as a way to get &#39;compile time polymorphism&#39;.<br />To reduce overhead from virtual calls when they can all be easily resolved at compile time. But I&#39;ve never seen anybody use this thing. I don&#39;t even know what I&#39;m looking at honestly.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (l j)</author>
		<pubDate>Sun, 06 Jan 2013 22:01:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I chose for a template implementation for two reasons:
</p><ol><li><p>All classes except an SfmlDrawableFactory uses Drawable*&#39;s. So I never need an instance of SfmlDrawable anyway.</p></li><li><p>Like I said in the OP, I don&#39;t want to need to define a new class when it&#39;s constructor will be exactly the same as the one from SfmlDrawable. All drawables will have enough data to fully initialize themselves in their init() method. Actually: this &quot;reason&quot; to do it just comes from pure lazyness on my part <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p></li></ol><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (J-Gamer)</author>
		<pubDate>Sun, 06 Jan 2013 22:02:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>OT:
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><div class="source-code snippet"><div class="inner"><pre><span class="c">/*</span>
<span class="c"> *     _______       ___       ____      __       _______       _______</span>
<span class="c"> *    /\  ____\    /|   \     /  __\    /\ \     /\  ____\     /\  ____\</span>
<span class="c"> *    \ \ ___/_   ||  _ \   |  /__/____\ \ \    \ \ ___/_    \ \ _____</span>
<span class="c"> *     \ \  ____\  || |_\ \  |\ \ /_  _\\ \ \    \ \  ____\    \ _____ \</span>
<span class="c"> *      \ \ ___/_ ||  ___ \ \ \ //\ / \ \ ____\ \ ___/_    / ____\ \</span>
<span class="c"> *       \ ______\||_|__/_\ \ \ _/ |   \ _____\\ ______\     /______\</span>
<span class="c"> *        /______/|/_/  /_/  ______/    /_____/ /______/     /______/</span>
<span class="c">*/</span>
</pre></div></div></div></div><p>
That is some seriously mangled ASCII art... <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Sun, 06 Jan 2013 22:05:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s Matthew&#39;s code parser, cuz it looks fine here in my editor. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>As for OT, I still don&#39;t get it. What classes will derive from SFML drawable? Why? Just to inherit a draw and init method? That seems kinda silly. Are these gonna be full objects or what? What are these things that you&#39;re making a class for?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 06 Jan 2013 22:15:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/611756/973819#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>As for OT, I still don&#39;t get it. What classes will derive from SFML drawable? Why? Just to inherit a draw and init method? That seems kinda silly. Are these gonna be full objects or what? What are these things that you&#39;re making a class for?</p></div></div><p>
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p><span class="source-code"><span class="k1">typedef</span> SfmlDrawable<span class="k3">&lt;</span>Player, sf::CircleShape&gt; SfmlPlayer<span class="k2">;</span></span></p></div></div><p>
This is how I make a new class. Player is a class from my game, and is an entity that runs around on the game world. All SfmlPlayer needs to be able to draw itself is a circle, which is initialized in the overridden init method. That is as far as &quot;inheritance&quot; goes here. SfmlPlayer, SfmlZombie, SfmlBullet,... actually are SfmlDrawable specializations.<br />The other option is to do this:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">class</span> SfmlDrawable <span class="k2">:</span> <span class="k1">public</span> Drawable <span class="k2">{</span>
<span class="number">  2</span>public:
<span class="number">  3</span>    SfmlDrawable<span class="k2">(</span>std::shared_ptr<span class="k3">&lt;</span>SfData&gt; env<span class="k2">)</span> <span class="k2">:</span> graphics_env<span class="k2">(</span>env<span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  4</span>    <span class="k1">virtual</span> <span class="k1">void</span> draw<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  5</span>    ... <span class="c">//Other functions, all virtual</span>
<span class="number">  6</span>protected:
<span class="number">  7</span>    std::shared_ptr<span class="k3">&lt;</span>SfData&gt; graphics_env<span class="k2">;</span>
<span class="number">  8</span><span class="k2">}</span>
<span class="number">  9</span>
<span class="number"> 10</span><span class="k1">class</span> SfmlPlayer <span class="k2">:</span> <span class="k1">public</span> SfmlDrawable <span class="k2">{</span>
<span class="number"> 11</span>public:
<span class="number"> 12</span>    SfmlPlayer<span class="k2">(</span>std::shared_ptr<span class="k3">&lt;</span>SfData&gt; env, Player<span class="k3">*</span> p<span class="k2">)</span> <span class="k2">:</span> SfmlDrawable<span class="k2">(</span>env<span class="k2">)</span>, p<span class="k2">(</span>p<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 13</span>        <span class="c">//Contents of init-method to initialize our shape.</span>
<span class="number"> 14</span>    <span class="k2">}</span>
<span class="number"> 15</span>    <span class="k1">void</span> draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    <span class="c">//Name other functions that need to be overridden</span>
<span class="number"> 17</span>private:
<span class="number"> 18</span>    sf::CircleShape shape<span class="k2">;</span>
<span class="number"> 19</span>    Player<span class="k3">*</span> p<span class="k2">;</span>
<span class="number"> 20</span><span class="k2">}</span>
</div></div><p>
And write those last 10+ lines of code for SfmlZombie, SfmlBullet,...<br />My method comes from pure lazyness not wanting to write quasi-identical code for each drawable class. It&#39;s just more concise(ie: It only costs me three lines(+ implementation of those two functions) to add SfmlPlayer).<br />Also, as I said, I never need the fact that they are a specialization of SfmlDrawable, only that they derive from Drawable.</p><p>Templates are code generators, and since all SfmlDrawable classes have the same class layout, it&#39;s easier to automate the code generation.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (J-Gamer)</author>
		<pubDate>Sun, 06 Jan 2013 22:30:18 +0000</pubDate>
	</item>
</rss>
