• ベストアンサー

クラスのインスタンスって何者?

麻野 なぎ(@AsanoNagi)の回答

  • ベストアンサー
回答No.2

C++におけるクラスの特徴のひとつに、 「組み込みのデータ型(int や double) と、限りなく同じような書式で使える」と いう点があります。 つまり、今回のお話は、クラス特有のお 話ではなく、 クラス名 利用名; は、「クラス名」という型の、利用名と いう変数についての取り扱いと同じです。 ※ちなみに、クラス本来の意味は、もう ちょっと違います。ご質問に関しては、 ユーザーが定義した型、インスタンスは、 その(ユーザーが定義した型)具体的な 変数という風に考えてみればいいかなと 思います。 最初にあった、static の有無で、毎回初 期化するかどうかが違ってくるというのは、 一般の「自動変数」と「静的(static) 変数」の違いなので、そういう方面を調べ てみてください。 変数には(インスタンスにも)スコープ というものがあって、 ・関数の中で宣言したものはその外では  見えない ・{……} の中で宣言した変数は、その外  では見えない ・ファイルの一番外側(どれかのの関数  の中でなくで定義した変数は、 それ  だけでは他のファイルからは見えない ・ついでにいえば、ファイルの一番外側  で、static つきで宣言した変数は、  どうあがいても外部から見えない というルールがあります。 以上を言い換えると、 ・別々の { …… } の中で宣言した変数は、  たとえ同じ名前でも、全く別物。 ・別々のファイルで宣言した変数はたとえ  同じ名前でも、全く別物。 となります。 付け加えれば、共通のヘッダファイルの中で 宣言したものも、別々のソースに、include した時点で、「別々のファイルに宣言された もの」となって、これまた、別物。 さて、結論に入ります。 【基本】 1)ひとつのソースファイルで、実体を宣言する クラス名 利用名; ※このとき、static はなし。別のファイルでも  参照したい場合、一番外側に宣言します。  (グローバル変数の扱いになる) 2)それを使うその他のファイルでは、「外部宣言」 extern クラス名 利用名; これで、どこからでも、参照することができます。 【応用】 こちらは、 http://oshiete1.goo.ne.jp/qa3670390.html でも、紹介していました。 1)共通のヘッダファイルには、例えば、   以下のように記述する #if defined(GLOBAL_HERE) #define EXE #else #define EXT extern #endif EXT クラス名 利用名; 2)ひとつのソースファイルに限定して、以下のよう   に include する   #define GLOBAL_HERE #include "ヘッダファイル" 3)その他のソースファイルでは、GLOBAL_HERE を   定義せずに単純に、 #include "ヘッダファイル" で include する。 ただし、一般的には、グローバル変数は、設計的に 危険を伴いやすいので、クラスのインスタンス自体を 各関数の引数として渡す方が、お勧めできます。

noname#202167
質問者

お礼

詳しい説明ありがとうございます。 2~3度読み返している内に段々解ってきた気がします。 >付け加えれば、共通のヘッダファイルの中で >宣言したものも、別々のソースに、include >した時点で、「別々のファイルに宣言された >もの」となって、これまた、別物。 そういう扱いになるのですね。 【基本】の扱いで上手く動作してくれました。 ありがとうございます orz 【応用】の方も一応やり方は理解できました。 #ifndefと同じ感 じなのですね。 >ただし、一般的には、グローバル変数は、設計的に >危険を伴いやすいので、クラスのインスタンス自体を >各関数の引数として渡す方が、お勧めできます。 そうなのですか。 そのやり方も調べて覚えて行こうと思います。 ありがとうございました。 しかし、最後に1つ気になる事が。 今回のトラブルでは無いのですが、私の質問内容の >>「クラス名 利用名;」 >>で使うと毎回別のインスタンスを呼び出すらしく値が空になるトラブルが起き >> >>「static クラス名 利用名;」 >>とすれば常に同じインスタンスになるからそれを使いなさいと教えられました。 >>以後ずっとこれを使ってきた―― これなのですが、 ソースAのメインループからソースBを何度も呼び出して処理する構造で、 ソースBからのみ利用するソースC D E Fそれぞれのクラスを ソースBの一番外側で 「クラス名 利用名;」 としたら、その一部クラスのメンバ全部が空になっている というトラブルが起きて 「static クラス名 利用名;」 と書きなさいと教えて頂いてから、怖くて常にこう使うようになってしまったのですが、 これはなぜ中身が消えてしまったのか お察しできる事例が有りますでしょうか・・? 今も中身が消える怖さでstaticを付けないのが怖いのですが・・。 本題の半分は解決したのですが、 よろしければこちらも教えて頂けると嬉しいです・・ orz

関連するQ&A

  • 同一クラスインスタンス名で別クラスのインスタンス作成方法(C++)

    下記ソース(Java)の処理をするような、C++の実装方法を教えていただきたいです。 【処理内容】 クラスBのインスタンスを保持しており、クラスBのインスタンス名と同一であるクラスAのインスタンス生成 ClassA A_Instance = (ClassA)Class.forName(B_instance.name).newInstance(); 要はクラスインスタンスの名前の求め方がわからないのです。それさえわかれば、newしてクラスポインタを返すメソッドを用意すれば何とかなると考えていますが。 ※C++のAPI一覧はどこにあるのだろうか・・・

  • 宣言と定義 通用範囲やインスタンス

    C++ビギナーの者です。 オブジェクト指向プログラムを見よう見まねでやって壁にぶつかっています。 わからない事が3つ程あります。 1. 「ヘッダーファイル中」と「ソースファイルの、関数・クラスの外側」と「その中」 この3箇所での、宣言や定義にはどんな制限等が存在するのでしょうか? ヘッダーに書くとダメなものが、ソースでならOKだったり混乱しています。 2. ClassAというクラスのインスタンスを、「複数の関数」で使いたい場合に  「ソースファイルの、関数・クラスの外側」 で ClassA classa; 等として、ソース内の複数の関数で利用するのは大間違いなのでしょうか? グローバル変数が何度も初期化されるトラブル等が起きています。 3. ソースファイルA側でデータを入れたvectorを ソースファイルB側で使うにはexternを付けるだけで良いのでしょうか? 手元にある参考資料から、見よう見まねでやってしまってるのですが、 C++の解説サイトにはあまり、こういった情報が載ってないのか見つけられません。 やはり書籍を買って勉強すべきだと痛感し始めたのですが、 解説のあるWebサイト、おすすめの書籍などが有りましたら それらも教えて頂けると幸いです。 よろしくお願いします っ_ _)っ

  • cocoa、objective-cのクラスをインスタンス化する順番を変えたいのですが可能なのでしょうか?

    cocoa、objective-cなのですが NSTableViewのデータを用意するにあったて データを用意するクラス”A”がIBによってインスタンス化の設定がなされていて クラス”A”が用意するデータがクラス”B”を参照する仕様なのですが、 クラス”B”もIBによってインスタンス化の設定がなされていてIBOutletによって ”A”と”B”お互いに接続されているのですが、クラス”A”がデータを参照するときに まだインスタンス化もしくは接続がなされていないようなので インスタンス化する順番を変えたいのですが可能なのでしょうか? それとも何か他の原因なのでしょうか? ご存知の方教えていただけないでしょうか? よろしくお願いします。

  • 別のクラスのインスタンスの作り方

    現在、javaからrubyに移行するために勉強しているのですが、別のファイルに定義したクラスのインスタンスが作成できなくて、困っています。 具体例をあげると require './B' class A end def initialize b = new B end end --別のファイル class B def initialize p 'hello' end  public : initalize end こんな2つのファイルがあったとして、Aのインスタンスを作成すると、 undefined method `B’ というエラーがでます。 私としてはこのエラーの原因がinitializeがデフォルトでprivate宣言なのが原因だと考えているのですが、publicと指定してもエラーとなることから、いくつか疑問が湧いたので質問させていただきます。 1、そもそもBクラスのインスタンスが作成できないのはinitializeがデフォルトでprivate宣言なのが原因なのか? 2、1があっていたと仮定するとBクラスのinitializeをpublic指定しているのになぜ呼び出せないのか? 3、rubyはなぜデフォルトでinitializeがprivateなのか?(javaではコンストラクタをprivateにするということは普通はしない。使うときはシングルトンやUtilのようなクラスを作るときに限る) 以上です。よろしくお願いします。

    • ベストアンサー
    • Ruby
  • rubyのインスタンスのクラス名取得

    現在rubyを勉強しているのですが、わからないことがありこまっています。 それはインスタンスにどんなクラスが入っているかわからないのです。 具体的にソースで説明させていただきます。 f= File.open("hello.txt") このfのインスタンスにどんなクラスのインスタンスが格納されているか知りたいのですが、何か方法は無いのでしょうか?

    • ベストアンサー
    • Ruby
  • クラスとインスタンスについて

    入社1年目のプログラミング経験0のSEです! Javaのクラスとインスタンスについてぜんぜん理解できません! 下のソースをどうしたらいいのかわからないです。 import java.io.*; class SumAndAvgMain{ public static void main(String argv[]){ BufferedReader r = new BufferedReader(new InputStreamReader(System.in),1); try{ //3教科の得点を入力しintに変換 //SumAndAvgクラスのインスタンスを作成 //合計点及び平均点を出力する。 }catch(IOException e){ System.out.println("例外発生"+e); } } } class SunAudAvg{ public static void main(String args[]){ //各教科の得点用のフィールド int kokugo; int suugaku; int eigo; //SumAndAvgクラスのコンストラクタ SumAndAvg(int kokugo,int suugaku,int eigo){ //フィールドに国語の点数を代入 //フィールドに数学の点数を代入 //フィールドに英語の点数を代入 } //3教科の合計点を求める int getGoukei(){ } //3教科の平均点を求める double getHeikin(){ } }

  • マルチスレッド下でのインスタンス変数・クラス変数

    よろしくお願いします。  マルチスレッド下で動作するクラスを作成しています。データにアクセスするためのオブジェクトを クラスのフィールド値として保持し、使い回しを行いたいと考えています。このデータアクセスオブジェクト(以下Dao)内では特にフィールドは使用せず、全てローカル変数のみで動作するようになっています。Dao自体は初回のクラス生成時にstatic処理にてフィールドにセットされます。  このDaoを保持するフィールドは、staticなクラス変数が良いのか、インスタンス変数として保持する方が良いのか迷っております。  クラス変数ならばPermanent領域をオブジェクト1つ分のメモリ使用で済み、インスタンス変数だとスレッド毎にheapを使い、処理数が増えるとメモリ圧迫しちゃう?と安易に考えてしまったりしています。  ご意見・ご助言よろしくお願い致します。

    • ベストアンサー
    • Java
  • Oracleインスタンスへの接続制限について

    1台のサーバにOracleのインスタンス(A、B)を複数立てた環境において、 クライアント1からはAインスタンスのみ利用可能、クライアント2からは Bインスタンスのみ利用可能とさせる事は可能でしょうか? (クライアント2の利用者にAインスタンスのインスタンス名、  ユーザ名、パスワードが漏れてしまっても、Aインスタンスに  接続できないように制限できればと思っています。) 宜しくお願いします。

  • 子クラスのインスタンスから親クラスのインスタンス変数の内容を表示する親クラスのメソッドを叩きたい

    お世話になっております。 rubyのコーディングで疑問が発生しましたので、質問させてください。 以下の様にクラスを定義してあるとします クラスA 体裁を整えて標準出力するクラス  ・インスタンス変数@Aを持つ  ・@Aを元に整形して標準出力する振る舞いを持つ クラスB Aの子クラスで、標準出力する内容を細かく設定するクラス  ・独自のインスタンス変数は持たない  ・親クラスのインスタンス変数@Aを編集する振る舞いを持つ 上記の実装である時、クラスBの振る舞いでクラスAのインスタンス変数@Aを編集しようとした際にエラーが発生します。 尚、レシーバはsuperです。 エラー内容 ./clsb.rb:49:in `edt_dsp': super: no superclass method `edt_dsp' (NoMethodE rror) エラー文中に出てる'edt_dsp'というメソッドが親クラスのインスタンス変数を編集するメソッドです。 尚、子クラスには独自の変数は無いのでinitializeメソッドは定義していません。 なぜこのようなエラーが発生してしまうのかわからず困っています。 現在自分でも色々とサイトを回って調べていますが、解決には至っていません。 ご回答いただければ幸いです。 以上です。よろしくお願いします。

    • ベストアンサー
    • Ruby
  • 動的に生成されるインスタンス間のやりとりについて

    あるクラスのインスタンスが動的に複数生成される状態で,一つのインスタンスから, 複数の他インスタンスのメンバ関数(仮に関数A)を呼びたいと考えています. そこでstaticなインスタンスのリストのようなものを設けようと考えました. 各インスタンスの関数Aへ関数ポインタの配列を定義し, それによって上記を実現しようと思いました. しかし,インスタンス生成前にインスタンス名を指定して (instance_name_.*p)(); という様に呼べるわけもなく,どう動的にインスタンスのリストを保持するかが思いつきません. 説明が下手ですいません.どなたか教えていただけますでしょうか. よろしくお願いします. 環境 Windows XP, cygwin