ページ 1 / 1
【C++】ある変数・関数を複数のクラスで共用する方法
Posted: 2014年12月07日(日) 01:29
by てろっぷ
C++において、ある変数・関数を複数のクラスで共用するために、クラスにまとめて仮想継承しようと考えたのですが、他により良い方法・より相応しい設計はありますか?
► スポイラーを表示
コード:
// --- Base.h --- //
#ifndef ___Class_Base
#define ___Class_Base
class Base {
/* -- 省略 -- */
};
#endif
// --- DerivedA.h --- //
#ifndef ___Class_DerivedA
#define ___Class_DerivedA
#include "Base.h"
class DerivedA : virtual protected Base {
/* -- 省略 -- */
};
#endif
// --- DerivedB.h --- //
#ifndef ___Class_DerivedB
#define ___Class_DerivedB
#include "Base.h"
class DerivedB : virtual protected Base {
/* -- 省略 -- */
};
#endif
Re: 【C++】ある変数・関数を複数のクラスで共用する方法
Posted: 2014年12月07日(日) 16:03
by h2so5
継承ではなく集約を使いましょう。
Re: 【C++】ある変数・関数を複数のクラスで共用する方法
Posted: 2014年12月07日(日) 16:23
by てろっぷ
集約…?
つまり、共用したい変数・関数を静的メンバとして持ったクラスオブジェクトを持つということですか?
イマイチイメージが摑めなくてすみません…
Re: 【C++】ある変数・関数を複数のクラスで共用する方法
Posted: 2014年12月07日(日) 16:51
by h2so5
静的メンバである必要性はありません。
コード:
#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++】ある変数・関数を複数のクラスで共用する方法
Posted: 2014年12月07日(日) 17:24
by てろっぷ
成る程、共用するクラスオブジェクトを引き数に取れば良かったのですね。
ありがとうございます。
では、理解を確実なものとするため重ねて質問させていただきますが、
1) スマートポインタを用いる理由(共有するクラスの型を用いるのはダメなのか)
2) 何故仮想継承ではいけないのか(仮想継承もポインタを共有出来る仕様だと思うので)
についても教えていただければ幸いです。
Re: 【C++】ある変数・関数を複数のクラスで共用する方法
Posted: 2014年12月07日(日) 18:22
by h2so5
てろっぷ さんが書きました:
1) スマートポインタを用いる理由(共有するクラスの型を用いるのはダメなのか)
ポインタを利用しない場合はオブジェクトがコピーされ、それぞれ独立したオブジェクトを持つことになるので共有できません。
てろっぷ さんが書きました:
2) 何故仮想継承ではいけないのか(仮想継承もポインタを共有出来る仕様だと思うので)
静的メンバの共有は実質的には可能です。
しかし、変数を共有する目的で継承を利用するのは、(例えるなら)買い物に出かけるのに乗用車ではなく消防車を使うようなものです。
不可能ではないですが本来の使い方から逸脱しています。
Re: 【C++】ある変数・関数を複数のクラスで共用する方法
Posted: 2014年12月07日(日) 19:05
by てろっぷ
成る程、そういうことでしたか。
確かに仰る通りですね。誤った理解のままで終わるところでした…σ(^_^;)
長くなってしまいましたが、親切に回答してくださってありがとうございました。
今後も何卒宜しくお願いします。
ということで解決と致しますね。