• ベストアンサー

クラスの外で宣言した変数について

初心者的な質問ですみません。 クラスの外で宣言した変数をそのままクラス内で使うことはできないのでしょうか? publicのメンバーにポインタの変数を作ってそこにアドレス指定するか、setするメソッドを作るしかないのでしょうか? もしクラスの外で宣言した変数をそのままクラス内で使えないのは、スコープ的にどういう理由で使えないのか教えて下さい。 クラス内クラスだと子クラスは親クラスの変数を参照できますが、それとは違うのでしょうか? どうぞよろしくお願い致します。

  • suffre
  • お礼率76% (2013/2633)

質問者が選んだベストアンサー

  • ベストアンサー
  • HDraco
  • ベストアンサー率100% (3/3)
回答No.11

■グローバル変数を扱う難しさの例 ○マルチスレッドのプログラム  変数Aをスレッド1とスレッド2から読み書きする処理がある場合、スレッド間で同期、または排他ロックなどをして同時に読み書きしないよう気を使う必要があり、プログラムもテストも大変難しくなります。  Windowsアプリの場合、ユーザインタフェース(画面とその入力)と内部処理が別スレッドで動かしたりすることも多いので意識してなくてもこういう問題が起こる場合があります。 ○複数人で開発するプログラム  グローバル変数を他の人のプログラムで読み書されていたら自分の意識外での影響があったりします。これをメンテナンスするのは大変ややこしいことになります。 ○それでもグローバル変数を使う場合  プログラム全体を慎重に設計してそれでもグローバル変数を使う場合もないことはないです。ただし、そのリスクとコストをわかった上で使います。例えば既にあるプログラムでグローバル変数を扱ってるけどもうこのプログラムは変更しない方針であるとか実際には理想通りなプログラムは少ないことも現実です。 プログラムの勉強をしている場合はグローバル変数を使ったプログラムをそうでないものに書き換える練習をしてみるのも面白いです。いままで複雑だったプログラムが段々糸がほぐれてスッキリしたものになった時は気持ちのイイものです。 ■クラス化について プログラム全体が見えないので何とも言えませんが… >変数A >↓ >関数func1で変数Aを加工 >↓ >関数func2で変数Aを加工 >↓ >… >↓ >最終的な変数Aの値が決まる >これが5000行くらいかけて変数Aを処理していました。 5000行もある処理なら、処理の途中で中間型のデータが何種類かにまとまりませんか?そのデータのまとまりを分けて行ってからクラスにまとめていくとクラス化しやすいかもしれません。それか処理を階層的に分けていくと何度も使う末端の処理を別クラスにするとかで分けていく方法もあります。どでかい関数がドカーンとあるクラスは作ってもあまりメリットありませんので。

suffre
質問者

お礼

グローバル変数の扱いについて詳しくご説明頂きましてありがとうございました。 他の方のご意見や、そのような解説をしているサイトも見つかり、だいたい一致したご意見ですね。 クラス化については一緒に仕事をしているプログラマの方に設計を見てもらうことにしました。 非常に参考になるご意見に感謝します。

その他の回答 (12)

  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.2

>クラスの外で宣言した変数をそのままクラス内で使うことはできないのでしょうか? C++の話であればできますよ。 やってみればわかると思いますけど。 cin, cout, cerrなど実際にありますよね。 ただし、お勧めはしません。 C#はできません。

suffre
質問者

お礼

ありがとうございます。 c++です。 c++ができて、c#ができないのはなぜでしょうか? 言語によってスコープが様々なのが理由だからですかね。 あとお勧めしない理由はなんですか? よろしくお願い致します。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

どういうプログラムを書いて, どんな問題があったのですか?

suffre
質問者

お礼

ありがとうございます。 c++です。 float a = 1; class CL{ public: void test(){printf("a=%f\n",a);} }; CL cl; main(){ cl.test(); } これだとaが「定義されていない識別子です」というエラーが出ます。

関連するQ&A

  • 変数の宣言をグローバルにしないと変数の参照が出来ま

    変数の宣言をグローバルにしないと変数の参照が出来ません。 ソース全体はカプセル化のために即時関数で囲っています。 function found内で小数点第三位までで四捨五入するようにする処理が共通なので関数化したのですが、 var gramNumを外で宣言しないと参照できずにgramNumが定義されていないと出てしまい困りました 関数スコープの影響だと思い宣言を外に出したのですが、それでも定義されていないと出て、 最終的にグローバル変数にしてやっとうまくいきました。 スコープは自分より上のスコープの変数は参照できるようですが if(xGramEmptyFlag === true) {ないの式がroundの上にあるvar gramNumを参照する場合、 if分の中にある式の一つ上のスコープなので参照できると思ったのですがなぜできないのでしょうか? varはブロックスコープがないので一つ上ではなく同じスコープにあることになるのでしょうか? ただその場合も同じスコープの変数は参照できるのではないのでしょうか?

  • インスタンス変数とクラス変数の違い

    1つのクラスオブジェクト内のインスタンス全てで共有できる クラス変数 @@a と、 同じインスタンス内であればメソッドの定義を越えてその値を 参照したり、変更したりできるインスタンス変数 @a のスコープの違いをお手すきでしたらご指導願えませんか? あとクラス変数にはセッターやゲッター等のアクセスメソッドを 設定できるんですか? いろいろ知りたいです。

    • ベストアンサー
    • Ruby
  • java ローカル変数の値について

    素人ですが、どうぞ宜しくお願いします。 ローカル変数について教えてください。 リストビューでクリックされたアイテムをonItemClickメソッド内の変数に格納されているのですが、 通常スコープ外ではこの値は参照できないですよね? このようなローカル変数をスコープ外で参照する方法はあるのでしょうか? たとえば別のクラスや、別のメソッド内など。 ローカル変数の値を、メンバ変数に送るようなことって可能ですか? リストビューで選択された値を使いまわしたいのですが、 そんな方法がありましたら、ぜひご教授いただけないでしょうか? 宜しくお願いいたします!

    • ベストアンサー
    • Java
  • 配列変数の宣言「その2」

    「その2」 「その1」でも述べましたが、配列変数の宣言の仕方は2種類あると思います。 (1)・・・ int hairetu[]; (2)・・・ int [] hairetu; この宣言をした後、init()メソッドを使いこの2つの配列変数の範囲(?)を指定したいと思います。 (1)の指定方法・・・ hairetu = new int[10]; (2)の指定方法・・・ hairetu[] = new int[10]; (2)を指定するときは(1)の指定方法が使えませんでした。これはなぜでしょうか? 逆に、(1)を指定するときには(1)は配列変数であるにもかかわらず、[] なしでも指定ができるのでしょうか? 知っていれば教えてください。

    • ベストアンサー
    • Java
  • クラス内のメンバ変数について

    クラス内のメンバ変数について Javaで作成したクラスのメンバ変数なのですが、クラス内のメンバ変数名の 一覧を取得する方法を探しています。 昔、仕事でやったような気がするのですが、忘れていました。 やりたいことは、メンバ変数のString型のメンバにtrimを行いたいのですが、 一つずつ名称を指定したくなく、どのクラスでも共通処理を行いたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • ローカルインナークラス

    ローカルインナークラスとは、 メソッド内で宣言されるクラス、 ですよね? ある問題に 「メソッドのブロック内でローカルインナークラスを定義した場合正しいものを選びなさい。 ○、インナークラスはfinalで宣言されたローカル変数しか使えない」 ???? ローカルクラスは「外部クラスのメンバ変数への参照更新は可能」ですよね??? 例 class Outer{   int count=0;     void func(){       class Inner{         void display(){           count++;         }       }     } } 外部クラスのcountにアクセスできますよね?? 問題が間違っているのか、 私が考え違いをしているのか、教えてください。

    • ベストアンサー
    • Java
  • クラスについての質問

    私はゲームを作っています。作り始めのころクラスの存在を知らずに めちゃくちゃに組んでいたのですが、最近になってクラスを使わないと 不便だという事に気が付きました。現在クラスを使用して修正中です。 クラスについて調べている時に、クラスの中のメンバの値を変える時は そのクラスの中でしか変えてはいけない、ととあるサイトで見かけました。 更にクラスのメンバはなるべくpublicで宣言してはいけないとも見かけました。 そこで気になったのですが、クラスの中のメンバの値をクラス外の 変数やクラスのメンバ等に代入したい時はどのようにすれば良いのでしょうか? クラス外でメンバを参照するにはpublicで宣言しなければなりませんし、 クラス内に変数をアドレスで引き渡して代入してしまうと、クラス内でしか 値を変えてはいけないということを守れなくなってしまいます。 このような場合はどのようにして値を代入すれば良いのでしょうか? 返答をお願いします!。

  • クラス変数とインスタンス変数

    PHP4でクラスを使いはじめたのですが、わからないことが出てきたので、教えてください。 クラスで指定したメンバ変数は、インスタンス毎に記憶さる、インスタンス変数になると思いますが、 クラスそのものに関連付けされた、クラス変数というものは、PHPでは使えないのでしょうか? 以上、よろしくお願いいたします。

    • 締切済み
    • PHP
  • 変数の参照でエラーが出てしまいます。(VB.NET)

    プロシージャの外に記した変数があるのですが、 (Dim IniFileName as string = "myapp.ini")など Public Shared Sub 内でIniFileNameを使おうとすると --------- クラスの明示的なインスタンスを指定しないで、共有メソッドまたは共有メンバ初期化子内からクラスのインスタンス メンバへ参照することはできません。 --------- というエラーが出てしまいます。 クラスの明示的なインスタンスを指定したいのですが、 意味がさっぱり分かりません。 class.IniFileNameとかForm1.IniFileNameなどとしてみたのですが違うようです。 一つ正解をご教示頂けたらと思います。 宜しくお願い致します。

  • 【C++】メンバ変数をポインタで宣言するデメリット

    クラスAが、メンバーとして、 クラスXと、クラスYを持っているとします。 そのようなとき、 【ケース1】  クラスAを定義する際、  メンバである、クラスX、クラスYは、ポインタで宣言させる。 【ケース2】  クラスAを定義する際、  メンバである、クラスX、クラスYは、ポインタではなく、クラスX/クラスYの型として宣言させる。 があると思いますが、それぞれどのようなデメリットがあるでしょうか? ----------------------------- 私は、ケース1は、 メリット:   クラスXを継承したクラスChild_Xや、クラスYを継承したクラスChild_Yを、   クラスAで扱えるようになる。   デメリット:   クラスXのポインタで宣言していると、クラスXを派生したクラスが格納可能であるため、   開発時に、そのメンバーに、実際にはどの型のクラスが格納されているかがわからず、   Visual Studio で追いかけられない。   (※そのメンバーに対して、右クリック⇒定義で見ても、どの型のポインタ変数かはわかっても、     どの型がそこに突っ込まれているかは、代入されているところを探して確認しないとわからない。) 私は、処理を確認する際、『どの型の値がそこに突っ込まれているかは、代入されているところを探して確認しないとわからない。』というのが、可読性は悪いわ、確認に時間が取られるわで、 非常に大きなデメリットと考えています。 このデメリットを解消する方法はあるのでしょうか?