うにゃ〜、やっぱりなにもやる気にならなくて困ってるEreyです。
やっぱり自分専用のPCがあるっていいですよね〜
あれがないこれがないってのがわかってるし、好き勝手にいじれるし…。
まぁ夏休みなんてなにもやる気にならないのはいつものことなのですが(たまに思い出したようにだけ何かをやる)何もやらなすぎるのもどうかと思い、下宿から実家に持ってきてた本に目を通しつつ時たまソースコードを書いていました。
んで、C++の参考書を持ってきてないのもなんなんですが…代わりに某アドベンチャーゲームプログラミングの本とおまけに付いてたCD−ROMの中にあるソースコードの一部のハードコピーを持ってきてたわけです。(ほかにMSDNライブラリとかは持ってきてある)
寝る前だとか暇なときにそれに目を通して、ソースコードを打つときにも横においてたりするわけですが…僕はそのソースコードをほとんど理解していません(ぉ。
仕方ないんで自己流でコード打ってます。
本にあるウィンドウクラス(とりあえずウィンドウズ用ソフト作る予定です)の流れはある程度分かるんだけど、やっぱしある程度だとこんがらがるわけです、頭が。
仕方ないんで単純な(本当かよ?)WinMainからはじまるソースに切り替えてみました。
メッセージループとかは本の方から導入。
そうやって本とソースのハードコピーとMSDNを使ってカタカタと打つわけです。
でも、なんだかすぐにファイラが落ちる…いや実家で僕が主に使ってるPCってのは某店で買ってきたジャンク品のペンティアム100くらい(いつのまにかAMD K6−2 200下駄付きになったみたい)の一体型PCだからって可能性もないわけじゃないんだけど…アクティブにしたりスタンバイモードとかから復旧させるとモジュールエラーだかなんだかで落ちる…他の所に被害がないのがせめてもの幸いだけど僕はファイラの「テキストエディターで開く」のボタンでソースコードを呼び出してるからファイラが使えないのは致命的。
まぁHDDの空きが350MBくらいしかないPCだったりするから他にインターネット以外やることないんだけどね。でもね〜、逆に言うとあんまりソフトのインストールと化したくないわけなのよ。だからBCCも入ってないから実験もできない。別に約15MB位なら問題ないだろってもねぇ。何かとやる気が起こらないんです、はい。
まぁ我が家で動いてる数少ないWin95マシンだから実験には使う予定だったりするわけですが…。
おっと、話が横にそれましたね。話を戻すよう努力してみましょう。
結局ソースコードを書いていてちょっと頭が無限ループに陥りました。
クラスのライフタイム(いつまでそのインスタンスが有効であるか)に関してです。
グローバル変数を宣言する場所辺り(WinMain以前)にクラスのインスタンスを置いた場合どこで開放(デストラクタが実行)されるのか、そこで詰まりました。
で、二・三日(もっとだろ、少なく見積もりすぎ)考えたんですがWinMainが終了するときに開放されるんだろうな〜、というのが最有力になったのですが…まだ不安だったのです。
仕方ないんで実験用のプログラム書いてみました。
こういう時は実験あるのみです。まぁ僕はそれさえもめんどくさがる人間なのですが…(ぉ
これが実験用のソースです。testclass.cpp
やることは簡単ですね。グローバルでインスタンスを作ったクラスとローカルでインスタンスを作ったクラスを置いてテキスト表示させるだけです。(文章にするより実際ソース見てください。僕が書く説明よりずっとわかると思います)
今回はコマンドプロンプト用で作ってます。わざわざウィンドウを作る必要はないと思ったので…。…いやウィンドウズで作ろうとすると頭がこんがらがりそうだったから…。
とりあえず、コンパイルするにはBCCをインストしなければ…。手元にあるCマガジンのCDからインスト。下宿に行けばもうインストしてあるのが恨めしいぃ…・。
インストしてから第一版をコンパイル開始〜。…数秒後…エラー6個…一個一個潰していく。きえねぇ…なくぞ、おぃ…。約30分後、グローバルで置くクラスのインスタンスはポインタからアロー演算子(->)でなければいけないようだ。さらにクラスのメンバ関数を全部main以前に記述していたら、「そんなとこには記述できね〜んだよ、こら」みたいな事言われて、メンバ関数を移動。(アップしてるソースは最終版です)
今度は…通ったぞ…さ〜て実行…えぇぇぇぇ!?
実験結果。
グローバルでポインタのインスタンス作ったらコンストラクタ&デストラクタが実行されませんでした。
画面キャプチャーなんてことは僕はできないんで…とりあえずDOSプロンプトに表示された奴を書いてみると以下のようになります。
C:\testclass>classtest
global class function testg::abc
local class open
local function jkl
global class function testg::def
local class function testp::ghi
local class closed
main closed
個人的にメモリリークが心配です…
つうか予想が外れた…ポインタでもインスタンスをおけばコンストラクタが実行されるのかと思えば結局実行されないでやんの。
ちなみにここに書いてるのは単なる僕の覚え書きです。それ以外の何者でもありません。
多分一週間くらいソース打たなかっただけでこの事忘れると思うので(ぉ
追記:
数日後ふと思って、作った実行ファイルをテキストエディターで開いてみました。
表示されなかったglobal class open.とかちゃんと入っていました。
でも実行すると表示されないんだよな〜。