► スポイラーを表示
【C++】ある変数・関数を複数のクラスで共用する方法
【C++】ある変数・関数を複数のクラスで共用する方法
C++において、ある変数・関数を複数のクラスで共用するために、クラスにまとめて仮想継承しようと考えたのですが、他により良い方法・より相応しい設計はありますか?
[tab=30]プログラミングって難しいですね…
Re: 【C++】ある変数・関数を複数のクラスで共用する方法
継承ではなく集約を使いましょう。
Re: 【C++】ある変数・関数を複数のクラスで共用する方法
集約…?
つまり、共用したい変数・関数を静的メンバとして持ったクラスオブジェクトを持つということですか?
イマイチイメージが摑めなくてすみません…
つまり、共用したい変数・関数を静的メンバとして持ったクラスオブジェクトを持つということですか?
イマイチイメージが摑めなくてすみません…
[tab=30]プログラミングって難しいですね…
Re: 【C++】ある変数・関数を複数のクラスで共用する方法
静的メンバである必要性はありません。
#include <iostream>
#include <memory>
class Common {
};
typedef std::shared_ptr<Common> CommonPtr;
class A {
public:
A(const CommonPtr& common) : common_(common) {}
private:
CommonPtr common_;
};
class B {
public:
B(const CommonPtr& common) : common_(common) {}
private:
CommonPtr common_;
};
int main() {
auto common = std::make_shared<Common>();
A a(common);
B b(common);
}
Re: 【C++】ある変数・関数を複数のクラスで共用する方法
成る程、共用するクラスオブジェクトを引き数に取れば良かったのですね。
ありがとうございます。
では、理解を確実なものとするため重ねて質問させていただきますが、
1) スマートポインタを用いる理由(共有するクラスの型を用いるのはダメなのか)
2) 何故仮想継承ではいけないのか(仮想継承もポインタを共有出来る仕様だと思うので)
についても教えていただければ幸いです。
ありがとうございます。
では、理解を確実なものとするため重ねて質問させていただきますが、
1) スマートポインタを用いる理由(共有するクラスの型を用いるのはダメなのか)
2) 何故仮想継承ではいけないのか(仮想継承もポインタを共有出来る仕様だと思うので)
についても教えていただければ幸いです。
[tab=30]プログラミングって難しいですね…
Re: 【C++】ある変数・関数を複数のクラスで共用する方法
ポインタを利用しない場合はオブジェクトがコピーされ、それぞれ独立したオブジェクトを持つことになるので共有できません。てろっぷ さんが書きました: 1) スマートポインタを用いる理由(共有するクラスの型を用いるのはダメなのか)
静的メンバの共有は実質的には可能です。てろっぷ さんが書きました: 2) 何故仮想継承ではいけないのか(仮想継承もポインタを共有出来る仕様だと思うので)
しかし、変数を共有する目的で継承を利用するのは、(例えるなら)買い物に出かけるのに乗用車ではなく消防車を使うようなものです。
不可能ではないですが本来の使い方から逸脱しています。
Re: 【C++】ある変数・関数を複数のクラスで共用する方法
成る程、そういうことでしたか。
確かに仰る通りですね。誤った理解のままで終わるところでした…σ(^_^;)
長くなってしまいましたが、親切に回答してくださってありがとうございました。
今後も何卒宜しくお願いします。
ということで解決と致しますね。
確かに仰る通りですね。誤った理解のままで終わるところでした…σ(^_^;)
長くなってしまいましたが、親切に回答してくださってありがとうございました。
今後も何卒宜しくお願いします。
ということで解決と致しますね。
[tab=30]プログラミングって難しいですね…