オブジェクト間での値の受け渡し方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nanobird
記事: 5
登録日時: 5年前

オブジェクト間での値の受け渡し方

#1

投稿記事 by nanobird » 5年前

c++で、BクラスがAクラスに所属しており、Bクラス内で、Aクラスのオブジェクトの持つ値を取得したいとなった場合、AクラスがBクラスのメンバ関数を引数をつけて呼び出す以外によい解決方法はないのでしょうか。

もしその方法しかない場合、さらにCクラスがBクラスに所属しており、CクラスのオブジェクトがAクラスのオブジェクトの持つ値を取得する際に、Aクラス→Bクラス→Cクラスと値を2回渡さなければならず少し不便な感じがするのですが、そういうものなのでしょうか。
それとも、こうするしかなくなったときはただクラスの設計が下手であっただけで、うまくやれば避けられるということなのでしょうか。

かずま

Re: オブジェクト間での値の受け渡し方

#2

投稿記事 by かずま » 5年前

nanobird さんが書きました:
5年前
c++で、BクラスがAクラスに所属しており、Bクラス内で、Aクラスのオブジェクトの持つ値を取得したいとなった場合、AクラスがBクラスのメンバ関数を引数をつけて呼び出す以外によい解決方法はないのでしょうか。
もっとよい解決方法を探しているということは、
よいとは思わないコードは存在しているのですね。
それを見せてください。

言葉による説明では質問内容がよくわかりません。

「BクラスがAクラスに所属しており」とは、

コード:

class A {
    clsss B { };
};
のようにクラスが入れ子になっているということでしょうか?
それとも

コード:

class B { };

class A {
    B b;
	B *p;  // どこかで p = new B; を実行する。
};
のようにメンバに B のオブジェクトや、ポインタがあるということでしょうか?
あるいは次のように継承を使っているのでしょうか?

コード:

class B { };

class A : public B { };

nanobird
記事: 5
登録日時: 5年前

Re: オブジェクト間での値の受け渡し方

#3

投稿記事 by nanobird » 5年前

コード:

class B { };

class A {
    B b;
	B *p;  // どこかで p = new B; を実行する。
};
情報不足で申し訳ございません。この形です。
ここでは、Aクラス、BクラスはTaskクラスを継承しており、それぞれの中身は以下のようになっているとします。

コード:

#pragma once

class Task {
public:
	virtual void update()     = 0;
};

class B:public Task{
	void update() override;
};

void B::update(){
//Aクラスのオブジェクトaもどこかで生成されそこからa.update()が呼ばれたとします。
	//ここでa.xを用いたい
}

class A:public Task{
public:
	void update() override;
private:
	B b;
	int x;
};


void A::update(){
	b.update();
}


クラスBはクラスAの変数xをupdate()の中で用いたいのですが、xを引数として渡すとなると、update()はupdate(int)の形になってしまい、Taskクラスの
virtual void update() = 0;
をoverrideできず新しいものを作らなければならなくなるので、あまりきれいではないように感じてしまうのです。

nanobird
記事: 5
登録日時: 5年前

Re: オブジェクト間での値の受け渡し方

#4

投稿記事 by nanobird » 5年前

すみません、最初言ったことと違いますね。下記の発言はなかったことにしていただけると嬉しいです。
nanobird さんが書きました:
5年前
もしその方法しかない場合、さらにCクラスがBクラスに所属しており、CクラスのオブジェクトがAクラスのオブジェクトの持つ値を取得する際に、Aクラス→Bクラス→Cクラスと値を2回渡さなければならず少し不便な感じがするのですが、そういうものなのでしょうか。

かずま

Re: オブジェクト間での値の受け渡し方

#5

投稿記事 by かずま » 5年前

B に A へのポインタを用意し、B のコンストラクタで
A へのポインタをセットすればよいでしょう。
update() はそのままです。

コード:

#pragma once

class Task {
public:
	virtual void update()     = 0;
};

class A;  // ★

class B: public Task {
public:
	B(A *p) : pA(p) { }  // ★
	void update() override;
private:
	A *pA;  // ★
};

class A: public Task{
public:
	A() : b(this) { }  // ★
	void update() override;
	int getX() const { return x; }  // ★
	// 上の1行の代わりに friend class B; と書いてもよい
private:
	B b;
	int x;
};
// 以上、header file

// 以下、実装(.cpp)
void B::update() {
	// pA->getX() を使う
	// class A の中に friend class B; があれば、pA->x でもよい
}

void A::update() {
	b.update();
}

nanobird
記事: 5
登録日時: 5年前

Re: オブジェクト間での値の受け渡し方

#6

投稿記事 by nanobird » 5年前

BにAのオブジェクトのポインタをもたせれば解決するんですね。ありがとうございます。

返信

“C言語何でも質問掲示板” へ戻る