アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。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)。実体がまだあるのだからアクセスする方法は
あると思うのですが・・・
どなたかよろしくお願いします。

A 回答 (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が発生しますが^^;
    • good
    • 0
この回答へのお礼

クラス2を作成するときにクラス1のポインタをわたさなければ
ならないんですね。わかりやすい御回答ありがとうございました
(^^)やりたいことができそうです。

お礼日時:2006/05/26 00:11

もしも、ご質問の記述が正確であれば、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();
}

です。
ただし、一般的には、あるクラスの内部のクラスに直接アクセスするのは、設計的なゆがみが現れている可能性の方が高いですね。
    • good
    • 0
この回答へのお礼

スタティック変数の使い方がわかりました(^^)
どうもありがとうございました。

お礼日時:2006/05/26 00:15

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;
}
    • good
    • 0
この回答へのお礼

ソースまで書いていただきどうもありがとうございました。
参考にさせていただきます。

お礼日時:2006/05/26 00:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています