![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
お世話になります。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)。実体がまだあるのだからアクセスする方法は
あると思うのですが・・・
どなたかよろしくお願いします。
No.1ベストアンサー
- 回答日時:
おそらくインスタンスに対する勘違いをされていると思います。
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を作成するときにクラス1のポインタをわたさなければ
ならないんですね。わかりやすい御回答ありがとうございました
(^^)やりたいことができそうです。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_04.png?e8efa67)
No.3
- 回答日時:
もしも、ご質問の記述が正確であれば、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();
}
です。
ただし、一般的には、あるクラスの内部のクラスに直接アクセスするのは、設計的なゆがみが現れている可能性の方が高いですね。
No.2
- 回答日時:
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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++のfor文について
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
構造体の要素すべてに対する四...
-
main.c:7:43: warning: implici...
-
main()とint main(void)の違い
-
void main (void)について、、、
-
C言語 宣言した変数になにも代...
-
typedef enumの使い方を教えて...
-
構造体を生成時にわざわざ初期...
-
2重定義って??
-
構造体メンバへの代入
-
64bit → 32bit型へのキャスト
-
直接アドレス指定のポインタの...
-
C++のコンストラクタを宣言する...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
intとINTの違いは?
-
C言語の<ctype.h>のisspace()に...
-
構造体の宣言でエラーが出ます。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
C++のfor文について
-
visualstudio C# テキストボッ...
-
typedef enumの使い方を教えて...
-
C++でboolにintの値を代入する...
-
構造体の要素すべてに対する四...
-
main.c:7:43: warning: implici...
-
変数の型を定義しなかった場合...
-
intとINTの違いは?
-
ハンドルされていない例外が発...
-
構造体の宣言でエラーが出ます。
-
プログラムの中で別のmainを呼...
-
関数の実体定義にヘッダファイ...
-
【#define】 defineで定義した...
-
C++ クラスをメンバにもつクラ...
-
VC6でlong longでエラー?
-
void func( void )について
-
エラー「invalid conversion fr...
おすすめ情報