<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>いちばんやさしいゲームの作り方 &#187; 言語仕様</title>
	<atom:link href="http://www.game-create.com/archives/tag/%e8%a8%80%e8%aa%9e%e4%bb%95%e6%a7%98/feed" rel="self" type="application/rss+xml" />
	<link>http://www.game-create.com</link>
	<description>文系の人でも、数理学がわからない人でもゲームプログラミングをマスターできるブログ</description>
	<lastBuildDate>Tue, 08 Jun 2010 01:28:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>関数の引数にデフォルト値を設定する</title>
		<link>http://www.game-create.com/archives/838</link>
		<comments>http://www.game-create.com/archives/838#comments</comments>
		<pubDate>Sat, 11 Oct 2008 15:18:48 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[言語仕様]]></category>
		<category><![CDATA[関数]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=838</guid>
		<description><![CDATA[関数の引数にデフォルト値を設定するためには、関数の仮引数に初期値を併記します。

関数の仮引数に初期値を設定すると、該当の実引数が省略された場合に初期値が設定されるようになります。
// 四捨五入する関数
int ro [...]]]></description>
			<content:encoded><![CDATA[<p>関数の引数にデフォルト値を設定するためには、関数の仮引数に初期値を併記します。</p>
<p><span id="more-838"></span></p>
<p>関数の仮引数に初期値を設定すると、該当の実引数が省略された場合に初期値が設定されるようになります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">// 四捨五入する関数
</span><span class="hl-types">int </span><span class="hl-identifier">round</span><span class="hl-brackets">(</span><span class="hl-types">float </span><span class="hl-identifier">value</span><span class="hl-code">, </span><span class="hl-types">int </span><span class="hl-identifier">precision</span><span class="hl-code"> = </span><span class="hl-number">2</span><span class="hl-brackets">)
{
  </span><span class="hl-comment">// 四捨五入のコード
</span><span class="hl-brackets">}

</span><span class="hl-identifier">round</span><span class="hl-brackets">(</span><span class="hl-number">3.141592</span><span class="hl-brackets">)</span><span class="hl-default">;    </span><span class="hl-comment">// OK
</span><span class="hl-identifier">round</span><span class="hl-brackets">(</span><span class="hl-number">3.141592</span><span class="hl-code">, </span><span class="hl-number">4</span><span class="hl-brackets">)</span><span class="hl-default">; </span><span class="hl-comment">// OK
</span><span class="hl-identifier">round</span><span class="hl-brackets">()</span><span class="hl-default">;            </span><span class="hl-comment">// NG! 第１引数はデフォルト値が無い
</span><span class="hl-identifier">round</span><span class="hl-brackets">(</span><span class="hl-code">, </span><span class="hl-number">4</span><span class="hl-brackets">)</span><span class="hl-default">;         </span><span class="hl-comment">// NG! 引数の途中を省略することはできない</span></pre></div></div>
<p>このように定義した関数で第２引数を省略すると、仮引数の precision = 2 より precision の初期値として２が設定されます。たとえば round(3.141592) と実行すると round(3.141592, 2) と実行したのと同じ意味になります。もちろん第２引数を明示的に書いた場合は実引数の値が precision の値になります。たとえば round(3.141592, 4) と実行した場合は precision は４になります。</p>
<p>また、引数を省略した場合は、続く引数を省略することはできても、続く引数を指定することはできません。たとえば次のような指定はコンパイルエラーになります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-types">void </span><span class="hl-identifier">SomeFunc</span><span class="hl-brackets">(</span><span class="hl-identifier">one</span><span class="hl-code"> = </span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">two</span><span class="hl-code"> = </span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-identifier">three</span><span class="hl-code"> = </span><span class="hl-number">3</span><span class="hl-brackets">)
{
}

</span><span class="hl-identifier">SomeFunc</span><span class="hl-brackets">()</span><span class="hl-default">;        </span><span class="hl-comment">// OK
</span><span class="hl-identifier">SomeFunc</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-brackets">)</span><span class="hl-default">;       </span><span class="hl-comment">// OK
</span><span class="hl-identifier">SomeFunc</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-number">2</span><span class="hl-brackets">)</span><span class="hl-default">;    </span><span class="hl-comment">// OK
</span><span class="hl-identifier">SomeFunc</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-number">3</span><span class="hl-brackets">)</span><span class="hl-default">; </span><span class="hl-comment">// OK
</span><span class="hl-identifier">SomeFunc</span><span class="hl-brackets">(</span><span class="hl-code"> , </span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-number">3</span><span class="hl-brackets">)</span><span class="hl-default">; </span><span class="hl-comment">// NG
</span><span class="hl-identifier">SomeFunc</span><span class="hl-brackets">(</span><span class="hl-code"> ,  , </span><span class="hl-number">3</span><span class="hl-brackets">)</span><span class="hl-default">; </span><span class="hl-comment">// NG
</span><span class="hl-identifier">SomeFunc</span><span class="hl-brackets">(</span><span class="hl-code"> , </span><span class="hl-number">2</span><span class="hl-code">,  </span><span class="hl-brackets">)</span><span class="hl-default">; </span><span class="hl-comment">// NG</span></pre></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/838/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配列変数のメモリを動的に確保する</title>
		<link>http://www.game-create.com/archives/829</link>
		<comments>http://www.game-create.com/archives/829#comments</comments>
		<pubDate>Sat, 11 Oct 2008 12:41:29 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[delete 演算子]]></category>
		<category><![CDATA[new 演算子]]></category>
		<category><![CDATA[ポインタ]]></category>
		<category><![CDATA[メモリ]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=829</guid>
		<description><![CDATA[配列変数のメモリを動的に確保するためには new 演算子を使います。

基本はスカラー変数の場合と同じですが、配列の場合は書式が異なります。
// int と double でそれぞれ 100 個の要素を確保するとき
 [...]]]></description>
			<content:encoded><![CDATA[<p>配列変数のメモリを動的に確保するためには new 演算子を使います。</p>
<p><span id="more-829"></span></p>
<p>基本は<a href="http://www.game-create.com/archives/825">スカラー変数の場合</a>と同じですが、配列の場合は書式が異なります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">// int と double でそれぞれ 100 個の要素を確保するとき
</span><span class="hl-types">int</span><span class="hl-default"> *</span><span class="hl-identifier">pointerOfIntArray</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-types">int</span><span class="hl-brackets">[</span><span class="hl-number">100</span><span class="hl-brackets">]()</span><span class="hl-default">;
</span><span class="hl-types">double</span><span class="hl-default"> *</span><span class="hl-identifier">pointerOfDoubleArray</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-types">double</span><span class="hl-brackets">[</span><span class="hl-number">100</span><span class="hl-brackets">]()</span><span class="hl-default">;</span></pre></div></div>
<p>おそらくメモリ確保の段階では間違えることも少ないと思いますが、問題はメモリ解放の場合です。 new で確保した配列メモリを解放するためには次のように書く必要があります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">delete </span><span class="hl-brackets">[] </span><span class="hl-identifier">pointerOfIntArray</span><span class="hl-default">;
</span><span class="hl-reserved">delete </span><span class="hl-brackets">[] </span><span class="hl-identifier">pointerOfDoubleArray</span><span class="hl-default">;</span></pre></div></div>
<p>delete の後にブラケットが必要である点に注意してください。これはプログラミングに慣れている人でもよく忘れてしまいます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/829/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>スカラー変数のメモリを動的に確保する</title>
		<link>http://www.game-create.com/archives/825</link>
		<comments>http://www.game-create.com/archives/825#comments</comments>
		<pubDate>Fri, 10 Oct 2008 07:43:07 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[delete 演算子]]></category>
		<category><![CDATA[new 演算子]]></category>
		<category><![CDATA[ポインタ]]></category>
		<category><![CDATA[メモリ]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=825</guid>
		<description><![CDATA[スカラー変数のメモリを動的に確保するためには new 演算子を使います。

ソースコードの中で変数を宣言すると、同時にそのデータを格納するためのメモリも確保されますが、逆に言うとソースコードの中で宣言しないとメモリは確保 [...]]]></description>
			<content:encoded><![CDATA[<p>スカラー変数のメモリを動的に確保するためには new 演算子を使います。</p>
<p><span id="more-825"></span></p>
<p>ソースコードの中で変数を宣言すると、同時にそのデータを格納するためのメモリも確保されますが、逆に言うとソースコードの中で宣言しないとメモリは確保されないことになります。この方法には「宣言するだけで必要なメモリを確保することができる」というメリットがある反面「コンパイル時にはプログラムに必要な変数とその個数をすべてリストアップしておく必要がある」というデメリットがあります。</p>
<p>つまり、メモリを自動的に確保するためには、プログラムを書いている段階で必要な変数とその個数が完全に決まっている必要があるのです。しかし、敵キャラの情報を格納する配列変数などはステージによって必要なサイズが違うかもしれません。しかし、メモリを自動的に確保する方法では、ステージに応じて変数のサイズを変えることはできず、無駄な領域が生まれてしまう可能性があります。</p>
<p>この問題を解決するためにはメモリを動的に確保します。</p>
<p>プログラムの実行が開始された後に「必要に応じてメモリを確保する」ためには new 演算子を使います。 new 演算子には確保したいデータの型情報を渡します。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">// メモリを確保する
</span><span class="hl-types">int</span><span class="hl-default"> *</span><span class="hl-identifier">pointerOfInt</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-types">int</span><span class="hl-brackets">()</span><span class="hl-default">;
</span><span class="hl-types">double</span><span class="hl-default"> *</span><span class="hl-identifier">pointerOfDouble</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-types">double</span><span class="hl-brackets">()</span><span class="hl-default">;</span></pre></div></div>
<p>new 演算子の戻り値はポインタになりますので、前述の例のようにポインタ変数で受け取ります。普通の変数は new 演算子の戻り値としては不適切です。なぜかというと普通の変数はすでにメモリが割り当たっているからです。</p>
<p>new 演算子によるメモリの確保は大変便利ですが一点だけ注意すべき点があります。それは「使い終わったメモリを解放しなければならない」ということです。もし、使い終わったメモリを解放しないで放置しておくとメモリリークを起こし、プログラムが異常終了する可能性が高くなります。</p>
<p>new 演算子によって確保したメモリを解放するためには delete 演算子を使います。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">// メモリを解放する
</span><span class="hl-reserved">delete </span><span class="hl-identifier">pointerOfInt</span><span class="hl-default">;
</span><span class="hl-reserved">delete </span><span class="hl-identifier">pointerOfDouble</span><span class="hl-default">;</span></pre></div></div>
<p>しかし、「 delete を自分で管理するのは面倒だなぁ」と感じられる方が大半かと思います。ご安心ください。 Boost というライブラリにスマートポインタという技術があります。スマートポインタを使うと delete を自分で実行する必要がありません。使われなくなったメモリを自動的にしてくれます。</p>
<p><a href="http://www.boost.org/" class="external">Boost</a></p>
<p>本ブログでもそのうち取り上げますので楽しみにお待ちください。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/825/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>変数で確保されているメモリサイズを調べる &#8211; sizeof 演算子</title>
		<link>http://www.game-create.com/archives/805</link>
		<comments>http://www.game-create.com/archives/805#comments</comments>
		<pubDate>Sun, 05 Oct 2008 09:01:42 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[sizeof 演算子]]></category>
		<category><![CDATA[メモリ]]></category>
		<category><![CDATA[変数]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=805</guid>
		<description><![CDATA[変数で確保されているメモリサイズを調べるためには sizeof 演算子を使います。

sizeof 演算子を使うと、その変数で確保されているメモリを知ることができるようになります。型のサイズが実装依存の C/C++ では [...]]]></description>
			<content:encoded><![CDATA[<p>変数で確保されているメモリサイズを調べるためには sizeof 演算子を使います。</p>
<p><span id="more-805"></span></p>
<p>sizeof 演算子を使うと、その変数で確保されているメモリを知ることができるようになります。型のサイズが実装依存の C/C++ では非常に重宝する演算子です。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-types">int </span><span class="hl-identifier">number</span><span class="hl-default">;
</span><span class="hl-types">int </span><span class="hl-identifier">string</span><span class="hl-brackets">[</span><span class="hl-number">80</span><span class="hl-brackets">]</span><span class="hl-default">;

</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">cout</span><span class="hl-default"> &lt;&lt;</span><span class="hl-reserved">sizeof</span><span class="hl-brackets">(</span><span class="hl-identifier">number</span><span class="hl-brackets">)</span><span class="hl-default"> &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">endl</span><span class="hl-default">; </span><span class="hl-comment">// 4 くらい
</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">cout</span><span class="hl-default"> &lt;&lt;</span><span class="hl-reserved">sizeof</span><span class="hl-brackets">(</span><span class="hl-identifier">string</span><span class="hl-brackets">)</span><span class="hl-default"> &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">endl</span><span class="hl-default">; </span><span class="hl-comment">// 320 くらい</span></pre></div></div>
<p>また、型名を渡すと、その型の変数で確保されるメモリサイズを知ることもできます。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">cout</span><span class="hl-default"> &lt;&lt;</span><span class="hl-reserved">sizeof</span><span class="hl-brackets">(</span><span class="hl-types">int</span><span class="hl-brackets">)</span><span class="hl-default"> &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">endl</span><span class="hl-default">; </span><span class="hl-comment">// 4 くらい
</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">cout</span><span class="hl-default"> &lt;&lt;</span><span class="hl-reserved">sizeof</span><span class="hl-brackets">(</span><span class="hl-types">long</span><span class="hl-brackets">)</span><span class="hl-default"> &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">endl</span><span class="hl-default">; </span><span class="hl-comment">// 4 から 8 くらい</span></pre></div></div>
<p>ただし、変数がポインタ変数の場合は、ポインタ変数自体のメモリサイズを返すため注意が必要です。たとえば、 new やmalloc 関数などで動的確保したメモリのサイズを返すことはできません。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/805/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>数値の内容によって分岐する &#8211; switch 文</title>
		<link>http://www.game-create.com/archives/689</link>
		<comments>http://www.game-create.com/archives/689#comments</comments>
		<pubDate>Mon, 08 Sep 2008 08:33:20 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[イディオム]]></category>
		<category><![CDATA[制御構文]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=689</guid>
		<description><![CDATA[数値の内容によって分岐するためには switch 文を使います。

たとえば enum 型は取りうる値が決まっているデータ型ですが、その正体は数値です。 enum 型変数の内容（数値）によって分岐する際に switch  [...]]]></description>
			<content:encoded><![CDATA[<p>数値の内容によって分岐するためには switch 文を使います。</p>
<p><span id="more-689"></span></p>
<p>たとえば enum 型は取りうる値が決まっているデータ型ですが、その正体は数値です。 enum 型変数の内容（数値）によって分岐する際に switch 文は力を発揮します。</p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre><span class="hl-types">typedef enum </span><span class="hl-identifier">GameMode </span><span class="hl-brackets">{
  </span><span class="hl-identifier">Opening</span><span class="hl-code">,
  </span><span class="hl-identifier">GameMain</span><span class="hl-code">,
  </span><span class="hl-identifier">GameOver</span><span class="hl-code">,
  </span><span class="hl-identifier">Ending
</span><span class="hl-brackets">} </span><span class="hl-identifier">GameMode</span><span class="hl-default">;

</span><span class="hl-identifier">GameMode current</span><span class="hl-default"> = </span><span class="hl-identifier">Opening</span><span class="hl-default">;

</span><span class="hl-reserved">switch </span><span class="hl-brackets">(</span><span class="hl-identifier">current</span><span class="hl-brackets">) {
</span><span class="hl-reserved">case </span><span class="hl-identifier">Opening</span><span class="hl-code">:
  </span><span class="hl-comment">// オープニングの処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameMain</span><span class="hl-code">:
  </span><span class="hl-comment">// メインループの処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameOver</span><span class="hl-code">:
  </span><span class="hl-comment">// ゲームオーバー時の処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-reserved">case </span><span class="hl-identifier">Ending</span><span class="hl-code">:
  </span><span class="hl-comment">// エンディングの処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>switch 文には重要なポイントがふたつあります。</p>
<ul>
<li>break を書かないと、その下の行が実行されてしまう</li>
<li>switch 句の数値が case に該当しない場合は default: というラベルへジャンプする</li>
</ul>
<p>実は switch 文というのはラベルジャンプに他ならないのです。ですので、もし break を書き忘れると後に続く処理も実行されてしまいます。これは当然です。プログラムは上から下へ実行されるからです。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">switch </span><span class="hl-brackets">(</span><span class="hl-identifier">current</span><span class="hl-brackets">) {
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameMain</span><span class="hl-code">:
  </span><span class="hl-comment">// 痛恨の break 書き忘れ
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameOver</span><span class="hl-code">:
  </span><span class="hl-comment">// おいおい current が GameMain の時にここも実行されちゃうぞ！？
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>しかし、 break の書き忘れが常に間違いかというとそうではなく、この動作を逆に利用して「違うラベルで同じ処理をさせる」ことができます。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">switch </span><span class="hl-brackets">(</span><span class="hl-identifier">current</span><span class="hl-brackets">) {
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameStage1</span><span class="hl-code">:
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameStage2</span><span class="hl-code">:
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameStage3</span><span class="hl-code">:
  </span><span class="hl-comment">// ステージ１～３の場合の処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameStage4</span><span class="hl-code">:
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameStage5</span><span class="hl-code">:
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameStage6</span><span class="hl-code">:
  </span><span class="hl-comment">// ステージ４～６の場合の処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>また、該当しない場合に default: へジャンプするというのは納得のいく仕様かと思われます。コンピュータを使っているとよく「デフォルト値」とか言うと思いますが、あれです。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">switch </span><span class="hl-brackets">(</span><span class="hl-identifier">current</span><span class="hl-brackets">) {
</span><span class="hl-reserved">case </span><span class="hl-identifier">Opening</span><span class="hl-code">:
  </span><span class="hl-comment">// オープニングの処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-reserved">case </span><span class="hl-identifier">Ending</span><span class="hl-code">:
  </span><span class="hl-comment">// エンディングの処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-reserved">default</span><span class="hl-code">:
  </span><span class="hl-comment">// 該当しない債務不履行な処理（債務不履行＝デフォルト）
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>ちなみに if 文でも同じことができるのですが enum 型と連携しての分岐はイディオム的な部分がありますので覚えておきましょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/689/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>クラスのメンバオブジェクトが初期化されるタイミング</title>
		<link>http://www.game-create.com/archives/651</link>
		<comments>http://www.game-create.com/archives/651#comments</comments>
		<pubDate>Wed, 27 Aug 2008 09:14:49 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[クラス]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=651</guid>
		<description><![CDATA[クラスのメンバオブジェクトが初期化されるタイミングは次のようになっています。


基底から派生
上から下

実は、クラス内では初期化順序に依存したコードが書けるんですね。ちなみにメンバ変数を初期化するためには次のように書 [...]]]></description>
			<content:encoded><![CDATA[<p>クラスのメンバオブジェクトが初期化されるタイミングは次のようになっています。</p>
<p><span id="more-651"></span></p>
<ul>
<li>基底から派生</li>
<li>上から下</li>
</ul>
<p>実は、クラス内では初期化順序に依存したコードが書けるんですね。ちなみにメンバ変数を初期化するためには次のように書きます。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-types">class </span><span class="hl-identifier">SomeClass
</span><span class="hl-brackets">{
</span><span class="hl-reserved">private</span><span class="hl-code">:
  </span><span class="hl-types">const int </span><span class="hl-identifier">m_var1</span><span class="hl-code">;
  </span><span class="hl-types">const int</span><span class="hl-code"> * </span><span class="hl-types">const </span><span class="hl-identifier">m_var2</span><span class="hl-code">;
</span><span class="hl-reserved">public</span><span class="hl-code">:
  </span><span class="hl-identifier">SomeClass</span><span class="hl-brackets">()</span><span class="hl-code">
    : </span><span class="hl-identifier">m_var1</span><span class="hl-brackets">(</span><span class="hl-number">0</span><span class="hl-brackets">)</span><span class="hl-code">, </span><span class="hl-identifier">m_var2</span><span class="hl-brackets">(</span><span class="hl-number">0</span><span class="hl-brackets">) </span><span class="hl-comment">// ←ここで初期化している
  </span><span class="hl-brackets">{
    </span><span class="hl-comment">// 空で良い
  </span><span class="hl-brackets">}
}</span><span class="hl-default">;</span></pre></div></div>
<p>こうするとメンバオブジェクトに対する初期化と認識されますので const なメンバオブジェクトにも値を設定することができるようになります。ブロックの中に書いた場合はただの代入です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/651/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>変数の数値を１増やす、または１減らす</title>
		<link>http://www.game-create.com/archives/592</link>
		<comments>http://www.game-create.com/archives/592#comments</comments>
		<pubDate>Wed, 13 Aug 2008 00:41:40 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[式]]></category>
		<category><![CDATA[数値]]></category>
		<category><![CDATA[算術演算子]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=592</guid>
		<description><![CDATA[変数の数値を１増やす、または１減らすためには、インクリメント演算子、またはデクリメント演算子を使います。

百聞は一見にしかず。早速例を見てください。
value = value + 1;
value = value  [...]]]></description>
			<content:encoded><![CDATA[<p>変数の数値を１増やす、または１減らすためには、インクリメント演算子、またはデクリメント演算子を使います。</p>
<p><span id="more-592"></span></p>
<p>百聞は一見にしかず。早速例を見てください。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">value</span><span class="hl-default"> = </span><span class="hl-identifier">value</span><span class="hl-default"> + </span><span class="hl-number">1</span><span class="hl-default">;
</span><span class="hl-identifier">value</span><span class="hl-default"> = </span><span class="hl-identifier">value</span><span class="hl-default"> - </span><span class="hl-number">1</span><span class="hl-default">;</span></pre></div></div>
<p>value の値をそれぞれ１増やしたり１減らしたりしていますが、これは次のように書くことができます。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">value</span><span class="hl-default">++;
</span><span class="hl-identifier">value</span><span class="hl-default">--;</span></pre></div></div>
<p>これがインクリメント演算子とデクリメント演算子です。この書き方は変数が評価されてから値が変わる点に注意してください。値が変わってから変数を評価したい場合は次のように書きます。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-default">++</span><span class="hl-identifier">value</span><span class="hl-default">;
--</span><span class="hl-identifier">value</span><span class="hl-default">;</span></pre></div></div>
<p>前置型と後置型は違いは次のようになります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">cout</span><span class="hl-default"> &lt;&lt;</span><span class="hl-identifier">value</span><span class="hl-default">++ &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">endl</span><span class="hl-default">;
</span><span class="hl-comment">// ↓と同じ意味
</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">cout</span><span class="hl-default"> &lt;&lt;</span><span class="hl-identifier">value</span><span class="hl-default"> &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">endl</span><span class="hl-default">;
</span><span class="hl-identifier">value</span><span class="hl-default"> = </span><span class="hl-identifier">value</span><span class="hl-default"> + </span><span class="hl-number">1</span><span class="hl-default">;

</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">cout</span><span class="hl-default"> &lt;&lt;++</span><span class="hl-identifier">value</span><span class="hl-default"> &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">endl</span><span class="hl-default">;
</span><span class="hl-comment">// ↓と同じ意味
</span><span class="hl-identifier">value</span><span class="hl-default"> = </span><span class="hl-identifier">value</span><span class="hl-default"> + </span><span class="hl-number">1</span><span class="hl-default">;
</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">cout</span><span class="hl-default"> &lt;&lt;</span><span class="hl-identifier">value</span><span class="hl-default"> &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">endl</span><span class="hl-default">;</span></pre></div></div>
<p>しかし、前置型と後置型の違いは可読性に影響を与えるという宗派もありますので注意してください。時に後置型のみを使うというルールで開発している人もいます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/592/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>新しい名前空間を作る</title>
		<link>http://www.game-create.com/archives/553</link>
		<comments>http://www.game-create.com/archives/553#comments</comments>
		<pubDate>Wed, 06 Aug 2008 01:51:15 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[スコープ]]></category>
		<category><![CDATA[名前空間]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=553</guid>
		<description><![CDATA[新しい名前空間を作るためには namespace 文を使います。

namespace 文に続けてコードを書くことによって、ブロックの中で定義した関数やクラスや変数がその名前空間に属するようになります。関数やクラスや変数 [...]]]></description>
			<content:encoded><![CDATA[<p>新しい名前空間を作るためには namespace 文を使います。</p>
<p><span id="more-553"></span></p>
<p>namespace 文に続けてコードを書くことによって、ブロックの中で定義した関数やクラスや変数がその名前空間に属するようになります。関数やクラスや変数を独自の名前空間に属させることによってシンボルの衝突を減らすことができるようになります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-types">namespace </span><span class="hl-identifier">sample
</span><span class="hl-brackets">{
  </span><span class="hl-types">void </span><span class="hl-identifier">someFunc</span><span class="hl-brackets">()
  {
  }

  </span><span class="hl-types">class </span><span class="hl-identifier">SomeClass</span><span class="hl-brackets">()
  {
  }

  </span><span class="hl-types">int </span><span class="hl-identifier">someValue</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>名前空間の中にあるオブジェクトにアクセスしたい場合は、名前空間の名前とシンボルをふたつのコロンで区切って次のように書きます。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">sample</span><span class="hl-default">::</span><span class="hl-identifier">someFunc</span><span class="hl-brackets">()</span><span class="hl-default">;
</span><span class="hl-identifier">sample</span><span class="hl-default">::</span><span class="hl-identifier">SomeClass</span><span class="hl-default"> *</span><span class="hl-identifier">instance</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-identifier">sample</span><span class="hl-default">::</span><span class="hl-identifier">SomeClass</span><span class="hl-brackets">()</span><span class="hl-default">;
</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">cout</span><span class="hl-default"> &lt;&lt;</span><span class="hl-identifier">sample</span><span class="hl-default">::</span><span class="hl-identifier">someValue</span><span class="hl-default"> &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-default">::</span><span class="hl-identifier">endl</span><span class="hl-default">;</span></pre></div></div>
<p>名前空間のシンボルをインポートしたい場合は using namespace 文を使います。 using namespace 文に続けて名前空間の名前を書くと、そのブロックの中だけ名前空間を省略することができるようになります。ただ、あまり広いブロックで using namespace を使うと、名前空間の意味が薄れてしまうため注意が必要です。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-brackets">{
  </span><span class="hl-reserved">using </span><span class="hl-types">namespace </span><span class="hl-identifier">sample</span><span class="hl-code">;
  </span><span class="hl-identifier">someFunc</span><span class="hl-brackets">()</span><span class="hl-code">;
</span><span class="hl-brackets">}

</span><span class="hl-identifier">someFunc</span><span class="hl-brackets">()</span><span class="hl-default">; </span><span class="hl-comment">// エラー！このスコープに using namespace がない
</span><span class="hl-identifier">sample</span><span class="hl-default">::</span><span class="hl-identifier">someFunc</span><span class="hl-brackets">()</span><span class="hl-default">; </span><span class="hl-comment">// OK</span></pre></div></div>
<p>なお、名前空間はネストすることができます。シンボルを階層構造にしたい場合に便利です。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-types">namespace </span><span class="hl-identifier">com
</span><span class="hl-brackets">{
  </span><span class="hl-types">namespace </span><span class="hl-identifier">game_create
  </span><span class="hl-brackets">{
    </span><span class="hl-types">void </span><span class="hl-identifier">someFunc</span><span class="hl-brackets">()</span><span class="hl-code">;
  </span><span class="hl-brackets">}
}

</span><span class="hl-identifier">com</span><span class="hl-default">::</span><span class="hl-identifier">game_create</span><span class="hl-default">::</span><span class="hl-identifier">someFunc</span><span class="hl-brackets">()</span><span class="hl-default">;</span></pre></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/553/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>継続条件如何に関わらず残りのループをスキップする &#8211; continue 文</title>
		<link>http://www.game-create.com/archives/549</link>
		<comments>http://www.game-create.com/archives/549#comments</comments>
		<pubDate>Tue, 05 Aug 2008 02:16:35 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[制御構文]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=549</guid>
		<description><![CDATA[継続条件如何に関わらず残りのループをスキップするためには continue 文を使います。

continue 文を使うと、そのループの残りの手続きをスキップし、次のループを開始することができるようになります。これは「基 [...]]]></description>
			<content:encoded><![CDATA[<p>継続条件如何に関わらず残りのループをスキップするためには continue 文を使います。</p>
<p><span id="more-549"></span></p>
<p>continue 文を使うと、そのループの残りの手続きをスキップし、次のループを開始することができるようになります。これは「基本的にすべての要素に処理をしたいのだが、一部例外の要素がある」という場合に便利です。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">for </span><span class="hl-brackets">(</span><span class="hl-types">int </span><span class="hl-identifier">i</span><span class="hl-code"> = </span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-identifier">i</span><span class="hl-code"> &lt;</span><span class="hl-identifier">MAX_ENEMY</span><span class="hl-code">; </span><span class="hl-identifier">i</span><span class="hl-code">++</span><span class="hl-brackets">) {
  </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-identifier">enemies</span><span class="hl-brackets">[</span><span class="hl-identifier">i</span><span class="hl-brackets">]</span><span class="hl-code">.</span><span class="hl-identifier">status</span><span class="hl-code"> == </span><span class="hl-identifier">Dead</span><span class="hl-brackets">) {
    </span><span class="hl-comment">// 敵キャラが死んでいる場合は次へ移る
    </span><span class="hl-reserved">continue</span><span class="hl-code">;
  </span><span class="hl-brackets">}
  </span><span class="hl-comment">// 敵キャラを動かす処理
</span><span class="hl-brackets">}</span></pre></div></div>
<p>continue 文は break 文と同様に、直接属するループの中のみスキップが可能です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/549/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>継続条件如何に関わらずループを終了する &#8211; break 文</title>
		<link>http://www.game-create.com/archives/545</link>
		<comments>http://www.game-create.com/archives/545#comments</comments>
		<pubDate>Mon, 04 Aug 2008 09:00:33 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[イディオム]]></category>
		<category><![CDATA[制御構文]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=545</guid>
		<description><![CDATA[継続条件如何に関わらずループを終了するためには break 文を使います。

break 文を使うと、そのループを強制的に抜けることができます。これによりループの終了を for や while 以外の場所で判断できるよう [...]]]></description>
			<content:encoded><![CDATA[<p>継続条件如何に関わらずループを終了するためには break 文を使います。</p>
<p><span id="more-545"></span></p>
<p>break 文を使うと、そのループを強制的に抜けることができます。これによりループの終了を for や while 以外の場所で判断できるようになります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">while </span><span class="hl-brackets">((</span><span class="hl-identifier">fgets</span><span class="hl-brackets">(</span><span class="hl-identifier">string</span><span class="hl-code">, </span><span class="hl-identifier">maxLength</span><span class="hl-code"> - </span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">fp</span><span class="hl-brackets">))</span><span class="hl-code"> != </span><span class="hl-prepro">NULL</span><span class="hl-brackets">) {
  </span><span class="hl-comment">// end の文字があったらループを終了する
  </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-identifier">lstrcmp</span><span class="hl-brackets">(</span><span class="hl-identifier">string</span><span class="hl-code">, </span><span class="hl-identifier">TEXT</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">end</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">))</span><span class="hl-code"> == </span><span class="hl-number">0</span><span class="hl-brackets">) {
    </span><span class="hl-reserved">break</span><span class="hl-code">;
  </span><span class="hl-brackets">}
}</span></pre></div></div>
<p>また、いつ終了するかわからないループを作る場合、 while の継続条件に１（または true ）と書いて無限ループを作り、終了条件は if 文と break 文を組み合わせて作るという手法がよく使われます。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-reserved">true</span><span class="hl-brackets">) {

  </span><span class="hl-comment">// 前略

  </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-mlcomment">/* 難解な終了条件 */</span><span class="hl-brackets">) {
    </span><span class="hl-reserved">break</span><span class="hl-code">;
  </span><span class="hl-brackets">}

  </span><span class="hl-comment">// 後略

</span><span class="hl-brackets">}</span></pre></div></div>
<p>なお、 break 文は break 文が直接属するループのみを抜ける点に注意が必要です。たとえば２重ループの場合、中のループで break 文を書いても外側のループに処理が戻るだけです。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-identifier">condition</span><span class="hl-code"> == </span><span class="hl-reserved">true</span><span class="hl-brackets">) {
  </span><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-identifier">innerCondition</span><span class="hl-code"> == </span><span class="hl-reserved">true</span><span class="hl-brackets">) {
    </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-mlcomment">/* 終了条件 */</span><span class="hl-brackets">) {
      </span><span class="hl-reserved">break</span><span class="hl-code">;
    </span><span class="hl-brackets">}
  }
  </span><span class="hl-comment">// ↑中のループで break したらここにくる
</span><span class="hl-brackets">}</span></pre></div></div>
<p>中のループから外側のループまで抜けたい場合は、外側のループにも if 文が必要です。また goto 文を使う方法もあります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-identifier">condition</span><span class="hl-code"> == </span><span class="hl-reserved">true</span><span class="hl-brackets">) {
  </span><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-identifier">innerCondition</span><span class="hl-code"> == </span><span class="hl-reserved">true</span><span class="hl-brackets">) {
    </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-mlcomment">/* 終了条件 */</span><span class="hl-brackets">) {
      </span><span class="hl-reserved">goto </span><span class="hl-identifier">endofloop</span><span class="hl-code">;
    </span><span class="hl-brackets">}
  }
}

</span><span class="hl-identifier">endofloop</span><span class="hl-default">:
</span><span class="hl-comment">// ここに飛んでくる</span></pre></div></div>
<p>ちなみに、 goto 文はこれ以外の用途で不用意に使うと批判の対象になってしまうため注意が必要です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/545/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
