ページ 1 / 1
オブジェクト間での値の受け渡し方
Posted: 2018年8月05日(日) 20:20
by nanobird
c++で、BクラスがAクラスに所属しており、Bクラス内で、Aクラスのオブジェクトの持つ値を取得したいとなった場合、AクラスがBクラスのメンバ関数を引数をつけて呼び出す以外によい解決方法はないのでしょうか。
もしその方法しかない場合、さらにCクラスがBクラスに所属しており、CクラスのオブジェクトがAクラスのオブジェクトの持つ値を取得する際に、Aクラス→Bクラス→Cクラスと値を2回渡さなければならず少し不便な感じがするのですが、そういうものなのでしょうか。
それとも、こうするしかなくなったときはただクラスの設計が下手であっただけで、うまくやれば避けられるということなのでしょうか。
Re: オブジェクト間での値の受け渡し方
Posted: 2018年8月06日(月) 18:33
by かずま
nanobird さんが書きました: ↑7年前
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 { };
Re: オブジェクト間での値の受け渡し方
Posted: 2018年8月06日(月) 23:46
by nanobird
コード:
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できず新しいものを作らなければならなくなるので、あまりきれいではないように感じてしまうのです。
Re: オブジェクト間での値の受け渡し方
Posted: 2018年8月07日(火) 01:01
by nanobird
すみません、最初言ったことと違いますね。下記の発言はなかったことにしていただけると嬉しいです。
nanobird さんが書きました: ↑7年前
もしその方法しかない場合、さらにCクラスがBクラスに所属しており、CクラスのオブジェクトがAクラスのオブジェクトの持つ値を取得する際に、Aクラス→Bクラス→Cクラスと値を2回渡さなければならず少し不便な感じがするのですが、そういうものなのでしょうか。
Re: オブジェクト間での値の受け渡し方
Posted: 2018年8月07日(火) 07:30
by かずま
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();
}
Re: オブジェクト間での値の受け渡し方
Posted: 2018年8月07日(火) 21:24
by nanobird
BにAのオブジェクトのポインタをもたせれば解決するんですね。ありがとうございます。