VC++クラス間のアクセス

このQ&Aのポイント
  • VC++クラス間のアクセスについての質問
  • Form1の初期化時にクラスをインスタンス化し、別のフォームからアクセスする方法
  • VC++でクラス間のアクセスを実現する方法についての質問
回答を見る
  • ベストアンサー

VC++クラス間のアクセス

 いつもお世話になっております。プログラミングの初心者で、言語についての知識は独学で勉強したCのみです。環境はOSがwindowsXPで、開発環境はVisualStudio2008professionalを使用しています。  今回の質問はクラス間のアクセスについてです。実現したい動作は以下のような内容です。  (1)Form1が初期化される時に、クラス(フィールドとメソッドを持つ もの)をインスタンス化する。  (2)イベントで、別のフォームを開く。  (3)(2)で開いたフォームのクラスから(1)でインスタンス化したクラスに アクセスして、クラスのメソッドを使用する。  拙い表現で分かりにくいかもしれませんが、どうかよろしくお願いいたします。

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

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

 こんにちは。  中のインスタンスを取り出すよりも、Form1を迂回させて操作した方が良いとは思います。  取り敢えず、こんな感じでしょうか。 //クラス public ref class CMyClass { public: explicit CMyClass(System::Int32 i) : m_i(i){} ~CMyClass(){} System::Int32 GetValue(){ return m_i; } private: System::Int32 m_i; }; Form1 +------------------------------------------------------------ //コンストラクタ Form1::Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // //ココで作成する m_gcMyClass = gcnew CMyClass(130); } //何かのイベント System::Void Form1::?????????() { //Form2を作成する Form2^ form2 = gcnew Form2(); form2->Show(this); } //インスタンスを取り出す CMyClass^ Form1::GetClass() { return m_gcMyClass; } //本当は此方の方が良い System::Int32 Form1::GetValue() { return m_gcMyClass->GetValue(); } ------------------------------------------------------------+ Form2内で、 //Form1を取りだす Form1^ form1 = dynamic_cast<Form1^>(this->Owner); //Form1内のCMyClassインスタンスを取り出す CMyClass^ myClass = form1->GetClass(); //使う System::Int32 iValue = myClass->GetValue(); //本当は此方の方が良い //Form1を取りだす Form1^ form1 = dynamic_cast<Form1^>(this->Owner); //Form1のメソッドを迂回する System::Int32 iValue = form1->GetValue();

watataku70
質問者

お礼

machongolaさん、回答ありがとうございました。御礼が遅くなり申し訳ありません。m(_)m  回答いただいた方法で早速やってみようと思います。まだまだ分からないことだらけなので、うまくいくかどうか分かりませんが、頑張ってみます。ありがとうございました。(^^)

watataku70
質問者

補足

 machongolaさん、こんにちは。回答いただいた方法を試してみたのですが、疑問点があり再度投稿しました。  Form2で呼び出しているGetValue()によってForm1で、作成したクラスをメソッドも含めて使えるようになるのでしょうか? また、CMyClass^ Form1::GetClass()や、System::Int32 Form1::GetValue()はForm1.hのどこに記述すればよいでしょうか?よろしくお願いいたします。m(_)m

その他の回答 (2)

回答No.3

 こんにちは。補足頂きました。  Form1にForm2をインクルード、Form2にForm1をインクルードする必要があります。  要はC言語と同じで、複雑化する時はヘッダとソースを確り分けないといけません。  Form1、Form2、CMyClassに[.cpp]を用意する事に成ります。

watataku70
質問者

お礼

 machongolaさん。早速の回答ありがとうございました。  アドバイスに従いテストプログラムを作成し、動作を確認しました。machongolaさんのお陰です。本当にありがとうございました。m(_)m

回答No.2

 こんばんは。補足頂きました。 >>Form2で呼び出しているGetValue()によってForm1で、作成したクラスをメソッドも含めて使えるようになるのでしょうか?   CMyClassのGetValue()メソッドのみしか使えないと言う事になります。間接的に転送しているだけです。 System::Int32 Form1::GetValue() { return m_gcMyClass->GetValue(); }  なので、CMyClassにString^ CMyClass::GetString()と言うメソッドを付け加えた場合、Form1には System::String^ Form1::GetString() { return m_gcMyClass->GetString(); }  と言った具合に、対応したメソッド呼び出しを追加していかなければ転送は出来ません。 //インスタンスを取り出す CMyClass^ Form1::GetClass() { return m_gcMyClass; }  で示した方は、お勧めは出来ない強引な手法なのですが、此方に関しては文字通り、Form1に置かれたCMyClassインスタンスを其のまま直接取り出して使用する為、Form1内に対応したメソッドを追加していく必要は無くなります。 >>CMyClass^ Form1::GetClass()や、System::Int32 Form1::GetValue()はForm1.hのどこに記述すればよいでしょうか?  Form1内に沢山メソッドが並んでいますが、その一番下辺りに並べて構いません。

watataku70
質問者

お礼

 すみません、machongolaさん。後先になりましたが、改めてお礼を申し上げます。また、先ほどの補足を訂正します。IntelliSenseでクラスのメソッドの選択はできませんでした。お詫びして訂正いたします。m(_)m

watataku70
質問者

補足

 こんにちは、machongolaさん。早速の回答ありがとうございました。  早速回答を頂いた方法で試してみたのですが、(インスタンスを取り出す方法)エラーが出てしまいました。エラーの内容は、 「error C2065: 'Form1' : 定義されていない識別子です。」 その後もいくつか同じ内容の(識別子のエラー)が続いた後、直前のエラーを修復できず、コンパイルが中止されます。  Form2のincludeが間違っているのでしょうか? ちなみにForm1.hでForm2をincludeしています。また、コード上ではForm2で、 //Form1内のCMyClassインスタンスを取り出す CMyClass^ myClass = form1->GetClass(); の記述後に「myClass->」と入力すると、IntelliSenseでクラスのメソッドが選択できるので、アクセスは出来ていると思うのですが・・・・・。

関連するQ&A

  • 共通クラスの利用方法

    言語:C# DBにアクセスするクラスや画面まわりで利用するクラスをまとめた共通クラスを作成しましたが、どこで宣言するのが効率的なんでしょうか? できれば宣言は一度だけにしたいのですが・・・ やっぱり使用するには各クラスでインスタンスを作成しなければならないのでしょうか?それとも、コンストラクタで渡すのでしょうか?ご教授お願いします。 例:Form1,Form2,共通クラスCommonがあるとします。 CommonをForm1でもForm2でも使用したいのですが、何かいい方法ありませんでしょうか?

  • VC++の印刷について

     VC++を勉強中のプログラミング初心者です。以前にC言語をかじった程度のレベルの者です。環境はOSはwindowsXPを、開発環境は VisualStudio2008professionalを使用しています。  現在VC++で簡単な家計簿ソフトを作成しているのですが、画面を印刷する方法が分かりません。メインフォーム画面をそのまま印刷したいのですが、どなたか方法(又は参考となる書籍、サンプルコード等)をご存知の方がいらっしゃいましたら、ご教授のほどよろしくお願い致します。m(_)m  

  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • Listクラスについて

     こんにちは。いつもお世話になっております。  プログラミングの初心者で、現在VC++でプログラムを作成しています。環境は、OSがWindowsXP、統合環境はVisualStudio2008 Professionalを使用しています。  プログラムの中で配列の代わりにListクラスを使いたいのですが、Listのインデックスを指定して値を代入することができません。MSDNではinsertメソッドでインデックスを指定して挿入ができるように書かれているのですが・・・・・。リストは整数を格納するためのもので、 List<int>^ zangakuList; と、宣言してメソッドの中では、 zangakuList->Insert(i, item->Money); のように使用しています。ちなみに、iの代わりに0を設定するとリストの先頭に値が代入されます。  お手数ですが、原因がお分かりの方、よろしくご教授ください。m(_)m

  • アクセスのフォームから別のフォームを開く

    アクセスのフォームで、あるフォームから別のフォームを開こうとしています。 Form_XXX.show vbModal というようなコードで実現可能かと思われますが、なぜかshowメソッドが選択できません(フォーム名は正しい)。 初歩的な質問ですが、どなたか対処法を教えていただけませんでしょうか。

  • C# でフォームやクラスを利用していく先で

    C# でフォームやクラスを利用していく先で どのフォームを経由してきたかを判別するメソッドはありますでしょうか? 例: Form1 |-Form2 |-Form3 |-Form4 Form4上のメソッドから、 現在 Form1の Form2の Form3の Form4 を経由してきました。 みたいな。 エラーのExceptionから取得できればいいのですが。

  • VC#2010 クラスの実体化について

    こんにちは、 現在の環境はWindows7でVisualStudio2010を使用しています。 最近 Cシャープを勉強し始め、疑問に思い質問させていただきました。 クラスを作成し、そのクラスの実体化を行わないで、 クラスのメンバ変数やメンバ関数などがエラーなく使えてしまいました。 C++のときはビルドエラーになっていたのにCシャープでは 実体化を行わなくてもよいと言いうことですか? 回答お願いします

  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • インスタンス変数とクラス変数の違い

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

    • ベストアンサー
    • Ruby
  • 僕の持ってるクラスの概念は正しいですか?

    僕の持ってる下記のクラスの概念は正しいですか? クラスとは、データ(「属性」または「フィールド」ともいう)とその操作手順であるメソッド(「振る舞い」、「動作」、「機能」ともいう)をまとめたオブジェクトの雛型(形式・様式を示す見本)を定義したもの。    クラスとは、いわば、何かを実行する物体(オブジェクト)の設計図のようなもの。何かを実行する物体というのは、例えば車をオブジェクトに例えると、「走る」,「車を止める」,「ライトをつける」ということを実行するが、クラスというのはその車(オブジェクト)の設計図。 また設計図だから、クラスの中には具体的に「何をさせたいのか」(車であれば、「走る」,「ライトをつける」等)を記述していくが、これがメソッドである。 また、車であれば、ナンバーや車種等の属性的情報があるが、このようにオブジェクトが保持する属性的情報がフィールドである。 また、この設計図を元に生み出された、実際に動作しているオブジェクトをインスタンスと呼ぶ。 車であれば、実際に走ったり止まったりライトをつけてるといったように、実際に動作しているオブジェクトがインスタンス。 これに関連し、オブジェクトとは、ソフトウェアが扱おうとしている現実世界に存在する物理的あるいは抽象的な実体を、属性(データ、フィールド)とメソッドの集合としてモデル化し、コンピュータ上に再現したもの。

    • ベストアンサー
    • Java

専門家に質問してみよう