トップページ > 過去ログ > 記事閲覧
クラスの初期化をする方法
名前:tm 日時: 2008/02/28 00:13

いつもお世話になってます。 初心者な私ですが、クラスを使ってプログラムを書こうと思いたちました。 が、メンバ変数の初期化をどうやってやろうかと悩んでいます。 コンストラクタで初期化をすれば良いというのは調べれば出てきました。 (初期化子でどうと言う話はいまいち理解できませんでしたが・・・(;_; ) ですが、メンバ変数を追加する度にいちいちやっているのもどうかと思いまして。 構造体でやっていたときには、 struct kouzoutai a = { 0 }; としていたので、いくら変数を追加しても関係なかったのですが・・・。 良い方法がありませんでしょうか。

Page: 1 |

Re: クラスの初期化をする方法 ( No.1 )
名前:優柔不断 日時:2008/02/28 18:48

こんな方法があります class A{ struct B{ int x; char y; double z; }member; public: A(){ struct B temp={0}; member=temp; } }; メンバ変数を全て構造体でくくって、コンストラクタ内でもう一つその構造体の変数を作ります。 その初期化時に0で埋めて、その変数をメンバ変数に代入してやるのです。 (注)ただし変数へのアクセスは面倒くさくなる。
Re: クラスの初期化をする方法 ( No.2 )
名前:TNT 日時:2008/02/28 20:52

初心者ということで、危ない方法はやっぱり消すことにしました。すみませんm(_ _)m (私自身も大概初心者ですが…) 書きかけた方法だけ記しておきます。動作原理と挙動が把握できる場合のみご使用ください。 1. コンストラクタ内で ZeroMemory(this, sizeof(*this)) を呼ぶ (virtualは使えない。また、メンバがコンストラクタを呼ぶ場合は要注意(というかまず使えない)) 2. クラス内にsAddrとeAddrを置いて、コンストラクタで ZeroMemory(&sAddr, &eAddr - &sAddr) を呼ぶ (メモリ上でメンバが上から順番に確保されている前提)
Re: クラスの初期化をする方法 ( No.3 )
名前:tm 日時:2008/02/28 20:50

ご回答ありがとうございます。 一発で上手くいっちゃう魔法の関数は無いんですね… 今はTNTさんのソースのようにやってますが、さてどうしたものか… ゼロクリアでの初期化(この初期化って言葉、今更ながらにまずいかなぁと思いつつ)は少しだけ不安も残りますし。 もう少しだけ悩んでみます、ありがとうございます。
Re: クラスの初期化をする方法 ( No.4 )
名前:tm 日時:2008/02/28 20:51

うわ、ソース消えたあ(笑 でもそんなの関係ねえ。
Re: クラスの初期化をする方法 ( No.5 )
名前: 日時:2008/02/28 20:55

単純なクラスならそれでも大丈夫かもしれませんが、 メンバ変数にくるのはconstだったりするとアクセス できても書き込めるとは限らないものもあります。 また継承などで派生先からだと、基底クラスなどが どうなるか判りません。 代入や初期化リストで済むものをわざわざ危険を 犯してまで一気に初期化することに意味があるとは 思えませんが。。。 ...消えたw
Re: クラスの初期化をする方法 ( No.6 )
名前:TNT 日時:2008/02/28 21:10

消したのは、仰るとおりの理由でございます(汗) 考えてみると次々と危険のかほりが…
Re: クラスの初期化をする方法 ( No.7 )
名前:tm 日時:2008/02/28 23:28

> 代入や初期化リストで済むものをわざわざ危険を 犯してまで一気に初期化することに意味があるとは 思えませんが。。。 やはり、新たに変数を追加する度に2箇所に記述しなければならないというのは、なるべくなら避けたいと思ってしまいます。 単純な効率でもそうですし、初期化し忘れでバグの原因にもなり兼ねないと思いますし… Googleで調べたり、お気に入りを巡回してましたが、初期化リストでやるのが最良とされている気がするのですが、どうなのでしょうか。
Re: クラスの初期化をする方法 ( No.8 )
名前: 日時:2008/02/29 01:19

>初期化リストでやるのが最良とされている気が >するのですが、どうなのでしょうか。 うーん、このあたりは好みで決める人も多いようで C言語になれてるひとなら代入とか使いますね。 初期化リストを使うと無駄な処理を省いたり することができるので、わざわざこれを使わない 手は無いということなのでしょう。 どう処理を省けるかはこちらを参考にでも。 ttp://www.02.246.ne.jp/~torutk/cxx/constructor/index.html
Re: クラスの初期化をする方法 ( No.9 )
名前:tm 日時:2008/02/29 01:52

そこまで処理を気にするよりかは、見た目や効率を重視したいところですがねぇ・・・正直。 でも仕組みは分かりました。 ありがとうございます。
Re: クラスの初期化をする方法 ( No.10 )
名前: 日時:2008/02/29 10:26

>そこまで処理を気にするよりかは、 >見た目や効率を重視したいところですがねぇ まぁ、先も書いたように好みの問題ですが、 効率よく書いたようにみせてバグを作り込んでは もともこもないうえ、それでは実装不可能な事が あるのですから仕方がないとあきらめるしか無いでしょう。 それに、URLに挙げた例はすごく簡単なクラスですが 複雑で大きなクラスになってくると、 そのオーバヘッドは結構なものになると思います。 コンストラクタで初期するというのは、その分 積み重なってコンストラクタが呼ばれるので、 出来るだけ軽くというのがあるようです。 あと、前提ですが >構造体でやっていたときには、 >struct kouzoutai a = { 0 }; とありますが、これ自体をクラスに該当するなら 「必要なものだけ初期化すればいい」という考えも 無くはありません。 初期化子がだらだら並ぶのはやはり見づらいと 感じるので。。。 #私的な意見なので参考程度に。。。
Re: クラスの初期化をする方法 ( No.11 )
名前:tm 日時:2008/02/29 14:15

とりあえず1つ、「効率」と言いましたのは「作る上での作業量の効率」であり、プログラム自体の処理効率ではありません。 言葉足らずで申し訳ないです。 そして私の勘違いでしたら更に申し訳ないです。 私は、”変数追加したあとの初期化忘れのせいで思うような動作をしなくなってしまう”ことをよくやってしまいますので…。 バグが起きる確率はどちらが高いか を気にしますと、やはり一気にゼロクリアしておいて貰った方がいいかなぁと思いました次第です。 でも確かに、オーバーヘッドがネックになることも考えられますからねぇ。 勉強させてもらいました。 ありがとうございます。

Page: 1 |