- ベストアンサー
C++ クラスをメンバにもつクラスについて
お世話になります。C++初心者でうまくコードが書けません(><) クラス1と2があり、クラス1のメンバにはクラス2があります。 メインでクラス1をインスタンス化してクラス2のfunc2を呼び出します。 func2ではクラス1のインスタンスから呼び出された場合にクラス1の m_int1を取得します。 Class Class1{ public: int m_int1; Class2 m_Class2; }; Class Class2{ public: void func2(); }; void Class2::func2(){ /*ここの記述方法が分かりません*/ /*C1から呼び出されたらC1のm_int1に100を入れる*/ /*以下間違え*/ class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/ C2_1.m_int1 = 100; } void main(){ class1 C1; C1.m_int1 = 10; C1.m_class2.func(); } C1.m_class2.func()の中から呼び出したC1にアクセスする方法が 分かりません(TT)。実体がまだあるのだからアクセスする方法は あると思うのですが・・・ どなたかよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
おそらくインスタンスに対する勘違いをされていると思います。 void Class2::func2(){ /*ここの記述方法が分かりません*/ /*C1から呼び出されたらC1のm_int1に100を入れる*/ /*以下間違え*/ class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/ C2_1.m_int1 = 100; } ここで行っているのは、あくまで func2関数内のローカル変数として宣言されているC2_1のm_int1に100を代入しているだけで、本来行いたい代入先とは別のインスタンスです。 *解決方1 func に class1のインスタンスを特定できる情報を渡す public: void func2 (class1 *ptr); void func2 (class1 &ptr); など。 *解決法2 class2 のコンストラクタで、自分をメンバ変数として持ってくれるclass1のポインタ等をもらう。 class class2 { public: class2 (class1 *ptr) : m_ptr (ptr) { } void func () { m_ptr->m_int1 = 100; } private: class1 *m_ptr; } です。 ちなみに解決法2ではwarningが発生しますが^^;
その他の回答 (2)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
もしも、ご質問の記述が正確であれば、static メンバを使うことになります。 つまり、m_init1 が、「インスタンスのものではなくクラスのもの」であれば、 Class Class1{ public: static int m_int1; Class2 m_Class2; }; Class Class2{ public: void func2(); }; void Class2::func2(){ Class1 C2_1;/*別のclass1のオブジェクトなのでこれに Class1::m_int1 = 100; // m_int1 は、インスタンスの持ち物ではなく、クラス全体の共用物 } void main(){ class1 C1; C1::m_int1 = 10; C1.m_class2.func(); } です。 ただし、一般的には、あるクラスの内部のクラスに直接アクセスするのは、設計的なゆがみが現れている可能性の方が高いですね。
お礼
スタティック変数の使い方がわかりました(^^) どうもありがとうございました。
- neko3839
- ベストアンサー率37% (100/269)
Class2 の関数内で、Class2の外にある Class1 のメンバ変数を更新するのは無理があります。私もC++を勉強し始めたときに似たようなところでつまずいたことがあります。(クラスの意味がわかっていなかった) 質問の意図とは少々ずれますが、下記の様な記述で実際に動きますので、この意味を考えてみてください。 #include "stdafx.h" #include <stdio.h> class Class2 { protected: int m_int2;//メンバ変数自体はプロテクトにした public: Class2() { m_int2 = 0;} //コンストラクタ //Class2のメンバ変数にアクセスする関数をClass2で用意 int func2() { return 100; } }; class Class1 { protected: int m_int1;//メンバ変数はプロテクトにした public: Class1() { m_int1 = 0;} //コンストラクタ //Class1のメンバ変数にアクセスする関数をClass1で用意 void SetData(int dat) { m_int1 = dat; } int GetData() { return m_int1; } }; int main(int argc, char* argv[]) { int tmp; Class1 C1; Class2 C2; C1.SetData(10); tmp = C1.GetData(); printf("%d\n", tmp); C1.SetData(C2.func2()); tmp = C1.GetData(); printf("%d\n", tmp); return 0; }
お礼
ソースまで書いていただきどうもありがとうございました。 参考にさせていただきます。
お礼
クラス2を作成するときにクラス1のポインタをわたさなければ ならないんですね。わかりやすい御回答ありがとうございました (^^)やりたいことができそうです。