【C++】ある変数・関数を複数のクラスで共用する方法

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

【C++】ある変数・関数を複数のクラスで共用する方法

#1

投稿記事 by てろっぷ » 9年前

C++において、ある変数・関数を複数のクラスで共用するために、クラスにまとめて仮想継承しようと考えたのですが、他により良い方法・より相応しい設計はありますか?
► スポイラーを表示
[tab=30]プログラミングって難しいですね…

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 【C++】ある変数・関数を複数のクラスで共用する方法

#2

投稿記事 by h2so5 » 9年前

継承ではなく集約を使いましょう。

てろっぷ
記事: 9
登録日時: 10年前

Re: 【C++】ある変数・関数を複数のクラスで共用する方法

#3

投稿記事 by てろっぷ » 9年前

集約…?
つまり、共用したい変数・関数を静的メンバとして持ったクラスオブジェクトを持つということですか?
イマイチイメージが摑めなくてすみません…
[tab=30]プログラミングって難しいですね…

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 【C++】ある変数・関数を複数のクラスで共用する方法

#4

投稿記事 by h2so5 » 9年前

静的メンバである必要性はありません。

コード:

#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);
}

てろっぷ
記事: 9
登録日時: 10年前

Re: 【C++】ある変数・関数を複数のクラスで共用する方法

#5

投稿記事 by てろっぷ » 9年前

成る程、共用するクラスオブジェクトを引き数に取れば良かったのですね。
ありがとうございます。

では、理解を確実なものとするため重ねて質問させていただきますが、
1) スマートポインタを用いる理由(共有するクラスの型を用いるのはダメなのか)
2) 何故仮想継承ではいけないのか(仮想継承もポインタを共有出来る仕様だと思うので)
についても教えていただければ幸いです。
[tab=30]プログラミングって難しいですね…

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 【C++】ある変数・関数を複数のクラスで共用する方法

#6

投稿記事 by h2so5 » 9年前

てろっぷ さんが書きました: 1) スマートポインタを用いる理由(共有するクラスの型を用いるのはダメなのか)
ポインタを利用しない場合はオブジェクトがコピーされ、それぞれ独立したオブジェクトを持つことになるので共有できません。
てろっぷ さんが書きました: 2) 何故仮想継承ではいけないのか(仮想継承もポインタを共有出来る仕様だと思うので)
静的メンバの共有は実質的には可能です。
しかし、変数を共有する目的で継承を利用するのは、(例えるなら)買い物に出かけるのに乗用車ではなく消防車を使うようなものです。
不可能ではないですが本来の使い方から逸脱しています。

てろっぷ
記事: 9
登録日時: 10年前

Re: 【C++】ある変数・関数を複数のクラスで共用する方法

#7

投稿記事 by てろっぷ » 9年前

成る程、そういうことでしたか。
確かに仰る通りですね。誤った理解のままで終わるところでした…σ(^_^;)

長くなってしまいましたが、親切に回答してくださってありがとうございました。
今後も何卒宜しくお願いします。

ということで解決と致しますね。
[tab=30]プログラミングって難しいですね…

閉鎖

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