- ベストアンサー
VC++クラス間のアクセス
- VC++クラス間のアクセスについての質問
- Form1の初期化時にクラスをインスタンス化し、別のフォームからアクセスする方法
- VC++でクラス間のアクセスを実現する方法についての質問
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 中のインスタンスを取り出すよりも、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();
その他の回答 (2)
- machongola
- ベストアンサー率60% (434/720)
こんにちは。補足頂きました。 Form1にForm2をインクルード、Form2にForm1をインクルードする必要があります。 要はC言語と同じで、複雑化する時はヘッダとソースを確り分けないといけません。 Form1、Form2、CMyClassに[.cpp]を用意する事に成ります。
お礼
machongolaさん。早速の回答ありがとうございました。 アドバイスに従いテストプログラムを作成し、動作を確認しました。machongolaさんのお陰です。本当にありがとうございました。m(_)m
- machongola
- ベストアンサー率60% (434/720)
こんばんは。補足頂きました。 >>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内に沢山メソッドが並んでいますが、その一番下辺りに並べて構いません。
お礼
すみません、machongolaさん。後先になりましたが、改めてお礼を申し上げます。また、先ほどの補足を訂正します。IntelliSenseでクラスのメソッドの選択はできませんでした。お詫びして訂正いたします。m(_)m
補足
こんにちは、machongolaさん。早速の回答ありがとうございました。 早速回答を頂いた方法で試してみたのですが、(インスタンスを取り出す方法)エラーが出てしまいました。エラーの内容は、 「error C2065: 'Form1' : 定義されていない識別子です。」 その後もいくつか同じ内容の(識別子のエラー)が続いた後、直前のエラーを修復できず、コンパイルが中止されます。 Form2のincludeが間違っているのでしょうか? ちなみにForm1.hでForm2をincludeしています。また、コード上ではForm2で、 //Form1内のCMyClassインスタンスを取り出す CMyClass^ myClass = form1->GetClass(); の記述後に「myClass->」と入力すると、IntelliSenseでクラスのメソッドが選択できるので、アクセスは出来ていると思うのですが・・・・・。
お礼
machongolaさん、回答ありがとうございました。御礼が遅くなり申し訳ありません。m(_)m 回答いただいた方法で早速やってみようと思います。まだまだ分からないことだらけなので、うまくいくかどうか分かりませんが、頑張ってみます。ありがとうございました。(^^)
補足
machongolaさん、こんにちは。回答いただいた方法を試してみたのですが、疑問点があり再度投稿しました。 Form2で呼び出しているGetValue()によってForm1で、作成したクラスをメソッドも含めて使えるようになるのでしょうか? また、CMyClass^ Form1::GetClass()や、System::Int32 Form1::GetValue()はForm1.hのどこに記述すればよいでしょうか?よろしくお願いいたします。m(_)m