- ベストアンサー
クラスの外で宣言した変数について
初心者的な質問ですみません。 クラスの外で宣言した変数をそのままクラス内で使うことはできないのでしょうか? publicのメンバーにポインタの変数を作ってそこにアドレス指定するか、setするメソッドを作るしかないのでしょうか? もしクラスの外で宣言した変数をそのままクラス内で使えないのは、スコープ的にどういう理由で使えないのか教えて下さい。 クラス内クラスだと子クラスは親クラスの変数を参照できますが、それとは違うのでしょうか? どうぞよろしくお願い致します。
- みんなの回答 (13)
- 専門家の回答
質問者が選んだベストアンサー
■グローバル変数を扱う難しさの例 ○マルチスレッドのプログラム 変数Aをスレッド1とスレッド2から読み書きする処理がある場合、スレッド間で同期、または排他ロックなどをして同時に読み書きしないよう気を使う必要があり、プログラムもテストも大変難しくなります。 Windowsアプリの場合、ユーザインタフェース(画面とその入力)と内部処理が別スレッドで動かしたりすることも多いので意識してなくてもこういう問題が起こる場合があります。 ○複数人で開発するプログラム グローバル変数を他の人のプログラムで読み書されていたら自分の意識外での影響があったりします。これをメンテナンスするのは大変ややこしいことになります。 ○それでもグローバル変数を使う場合 プログラム全体を慎重に設計してそれでもグローバル変数を使う場合もないことはないです。ただし、そのリスクとコストをわかった上で使います。例えば既にあるプログラムでグローバル変数を扱ってるけどもうこのプログラムは変更しない方針であるとか実際には理想通りなプログラムは少ないことも現実です。 プログラムの勉強をしている場合はグローバル変数を使ったプログラムをそうでないものに書き換える練習をしてみるのも面白いです。いままで複雑だったプログラムが段々糸がほぐれてスッキリしたものになった時は気持ちのイイものです。 ■クラス化について プログラム全体が見えないので何とも言えませんが… >変数A >↓ >関数func1で変数Aを加工 >↓ >関数func2で変数Aを加工 >↓ >… >↓ >最終的な変数Aの値が決まる >これが5000行くらいかけて変数Aを処理していました。 5000行もある処理なら、処理の途中で中間型のデータが何種類かにまとまりませんか?そのデータのまとまりを分けて行ってからクラスにまとめていくとクラス化しやすいかもしれません。それか処理を階層的に分けていくと何度も使う末端の処理を別クラスにするとかで分けていく方法もあります。どでかい関数がドカーンとあるクラスは作ってもあまりメリットありませんので。
その他の回答 (12)
- wormhole
- ベストアンサー率28% (1626/5665)
>クラスの外で宣言した変数をそのままクラス内で使うことはできないのでしょうか? C++の話であればできますよ。 やってみればわかると思いますけど。 cin, cout, cerrなど実際にありますよね。 ただし、お勧めはしません。 C#はできません。
お礼
ありがとうございます。 c++です。 c++ができて、c#ができないのはなぜでしょうか? 言語によってスコープが様々なのが理由だからですかね。 あとお勧めしない理由はなんですか? よろしくお願い致します。
- Tacosan
- ベストアンサー率23% (3656/15482)
どういうプログラムを書いて, どんな問題があったのですか?
お礼
ありがとうございます。 c++です。 float a = 1; class CL{ public: void test(){printf("a=%f\n",a);} }; CL cl; main(){ cl.test(); } これだとaが「定義されていない識別子です」というエラーが出ます。
- 1
- 2
お礼
グローバル変数の扱いについて詳しくご説明頂きましてありがとうございました。 他の方のご意見や、そのような解説をしているサイトも見つかり、だいたい一致したご意見ですね。 クラス化については一緒に仕事をしているプログラマの方に設計を見てもらうことにしました。 非常に参考になるご意見に感謝します。