c++で、BクラスがAクラスに所属しており、Bクラス内で、Aクラスのオブジェクトの持つ値を取得したいとなった場合、AクラスがBクラスのメンバ関数を引数をつけて呼び出す以外によい解決方法はないのでしょうか。
もしその方法しかない場合、さらにCクラスがBクラスに所属しており、CクラスのオブジェクトがAクラスのオブジェクトの持つ値を取得する際に、Aクラス→Bクラス→Cクラスと値を2回渡さなければならず少し不便な感じがするのですが、そういうものなのでしょうか。
それとも、こうするしかなくなったときはただクラスの設計が下手であっただけで、うまくやれば避けられるということなのでしょうか。
オブジェクト間での値の受け渡し方
Re: オブジェクト間での値の受け渡し方
もっとよい解決方法を探しているということは、
よいとは思わないコードは存在しているのですね。
それを見せてください。
言葉による説明では質問内容がよくわかりません。
「BクラスがAクラスに所属しており」とは、 のようにクラスが入れ子になっているということでしょうか?
それとも のようにメンバに B のオブジェクトや、ポインタがあるということでしょうか?
あるいは次のように継承を使っているのでしょうか?
Re: オブジェクト間での値の受け渡し方
情報不足で申し訳ございません。この形です。
ここでは、Aクラス、BクラスはTaskクラスを継承しており、それぞれの中身は以下のようになっているとします。
クラスBはクラスAの変数xをupdate()の中で用いたいのですが、xを引数として渡すとなると、update()はupdate(int)の形になってしまい、Taskクラスの
virtual void update() = 0;
をoverrideできず新しいものを作らなければならなくなるので、あまりきれいではないように感じてしまうのです。
ここでは、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();
}
virtual void update() = 0;
をoverrideできず新しいものを作らなければならなくなるので、あまりきれいではないように感じてしまうのです。
Re: オブジェクト間での値の受け渡し方
B に A へのポインタを用意し、B のコンストラクタで
A へのポインタをセットすればよいでしょう。
update() はそのままです。
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();
}