
お世話になります。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のポインタをわたさなければ
ならないんですね。わかりやすい御回答ありがとうございました
(^^)やりたいことができそうです。

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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- Visual Basic(VBA) セルS2に入力した「月」と一致したB列の右隣へセルS110の値を転記する下記マクロを実行するとエラー 2 2022/12/06 17:32
- 英語 節を列挙する例示表現について 2 2022/08/15 13:52
- 工学 Pythonの3次元描画に関する質問です 3 2022/12/07 20:07
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数のアドレスを関数から取得...
-
外部変数について
-
値の受け渡しについて…
-
vector<int> に Serialize を使...
-
DWORDの実際の型は何でしょうか
-
クラスや構造体のarrayを作りた...
-
C言語のプログラムで...
-
intとINTの違いは?
-
テンプレート引数の型を実行時...
-
構造体のサイズが意味不明の数...
-
変数の型を定義しなかった場合...
-
フィボナッチ数列 c言語
-
C++でパラメータのやり取りでわ...
-
int *a = new int; エラー
-
C++の配列オブジェクトを宣言と...
-
C++のfor文について
-
visualstudio C# テキストボッ...
-
DLLの明示的な呼び出し
-
c言語について教えて下さい
-
unsigned *という宣言について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
main.c:7:43: warning: implici...
-
2重定義って??
-
変数の型を定義しなかった場合...
-
C++でboolにintの値を代入する...
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
ハンドルされていない例外が発...
-
void func( void )について
-
C言語のコンパイルエラー
-
enumについて
-
関数の実体定義にヘッダファイ...
-
C言語 宣言した変数になにも代...
-
C++ クラスをメンバにもつクラ...
-
プログラムの中で別のmainを呼...
-
sshdログの意味
おすすめ情報