(C++)クラスAのメンバであるクラスaの継承

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yuma

(C++)クラスAのメンバであるクラスaの継承

#1

投稿記事 by yuma » 10年前

クラスaをメンバとして含むクラスAがあります。
そこでクラスaを継承したクラスa' をつくりました。

この後、クラスa' をメンバとするクラスA' を作る際、
クラスA' をクラスAの継承とすることはできるのでしょうか?
できるのならばどうすればいいのでしょうか?

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: (C++)クラスAのメンバであるクラスaの継承

#2

投稿記事 by beatle » 10年前

そのクラス構造に意味があるのか、良い設計なのかは別として、技術的には何も問題なくできると思います。

コード:

class a {};
class A {
    a a_;
};
class a_dash : public a {};
class A_dash : public A {
    a_dash a_dash_;
};

yuma

Re: (C++)クラスAのメンバであるクラスaの継承

#3

投稿記事 by yuma » 10年前

コメントありがとうございます。
ちょっと説明が不十分でしたね。
そりゃ無理やりならできますが...

コード:

class a {
 public:
//
 private:
    int x;
    int y;
};
class A {
//
    public:
    a a_;
};

A  function(){
    static A A1;
    //
    return A1;
}

というのを

コード:

class a {
    public:
//
    private:
    int x;
    int y;
};
class A {
//
    public:
    a a_;
};

class a_dash : public a {
    public:
    bool yn;
};
class A_dash : public A {
    //☆
};


A  function(hoge){
    static A_dash A_dash1;
    A_dash1.a_.yn=hoge;
    //
    A A1=A_dash1;//アップキャストしたい。
    return A1;//変えたくない。
}

というコードに書き直したいのです。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: (C++)クラスAのメンバであるクラスaの継承

#4

投稿記事 by beatle » 10年前

A_dashのa_はあくまでもa型なので、
A_dash1.a_.yn
にはアクセスできません(A_dash1.a_の中にynが存在しません)

何がやりたいのか良く分かりませんが、推測するに
「Aのクラス定義はそのままで、Aにメンバを追加したい」のでしょうか?

聞いてる限りですと、とても無理筋なクラス設計を考えているように思います。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: (C++)クラスAのメンバであるクラスaの継承

#5

投稿記事 by beatle » 10年前

一般論ですが、アップキャストというのは「参照」とか「ポインタ」で使う技術です。
functionの戻り値がA*であったなら、似たようなことは出来るかもしれませんね

コード:

A* function(bool hoge) {
    static A_dash A_dash1;
    ((a_dash*)A_dash1.a_)->yn = hoge;
    A* A1 = &A_dash1;
    return A1;
}
A_dash1.a_を実インスタンスではなく、aへのポインタ型として宣言していると仮定しています。
そして、A_dashのコンストラクタでa_に対し、a_dash型インスタンスへのポインタを設定します。

コード:

class A {
public:
    a* a_;
    A() : a_(new a()) {}
    A(a* a_) : a_(a_) {}
};
class A_dash : public A {
public:
    A_dash() : A(new a_dash()) {}
};
こんな感じでしょうか?(コンパイル確認してませんが悪しからず)

無理やりやってみましたが、あまり良い設計ではないと思います。

yuma

Re: (C++)クラスAのメンバであるクラスaの継承

#6

投稿記事 by yuma » 10年前

なるほど、やはり無理がある気がしますね。
コードありがとうございます。


ところで、自分はクラス設計とかに関してほとんど無知ですのでお聞きしたいのですが、

「Aのクラス定義はそのままで、Aにメンバを追加したい」、のは無理筋と書かれていますが、
これは「継承」の考え方ではないのでしょうか?

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: (C++)クラスAのメンバであるクラスaの継承

#7

投稿記事 by beatle » 10年前

「継承」はあくまでも、「新しいクラスを作って」メンバを追加する、のです。

コード:

    static A_dash A_dash1;
    A_dash1.a_.yn=hoge;
を見る限り、クラスaを変更せずにクラスaにynを追加したいように見えたのです。
でも、それは文法的に出来ないとyumaさんも分かっているのでしょう。
実際にはクラスa_dashを作ってそこにynを定義していますね。

ポイントなのは、クラスA_dashはクラスa_dashと一切関係無いことです。
A_dashは自分でa_dashのメンバを持っているわけではありません。
かといって、継承元のAがa_dashのメンバを持っているわけでもありません。

a_dashはaを継承してはいるのですが、それはA,A_dash,aとは全く無関係であり、a_dashの定義が存在しなくてもA,A_dash,aには影響を及ぼさないのです。
世界の中にぽつんと、aを継承したa_dashなるクラスが存在する、ただそれだけです。


お示しになられたソースコードでは、何をやりたいのか(少なくとも僕には)全然伝わりませんので、
本当のソースコードを示すか、ご自分でより良い設計を発見するかしてください。

sql

Re: (C++)クラスAのメンバであるクラスaの継承

#8

投稿記事 by sql » 10年前

beatle さんが書きました:
ポイントなのは、クラスA_dashはクラスa_dashと一切関係無いことです。
A_dashは自分でa_dashのメンバを持っているわけではありません。
かといって、継承元のAがa_dashのメンバを持っているわけでもありません。

a_dashはaを継承してはいるのですが、それはA,A_dash,aとは全く無関係であり、a_dashの定義が存在しなくてもA,A_dash,aには影響を及ぼさないのです。
世界の中にぽつんと、aを継承したa_dashなるクラスが存在する、ただそれだけです。
beatleさんの書いたこの箇所が、C++の肝である「オブジェクト指向」ですよ。
まず、これを感覚的に理解していればこのような質問は出ないはずです。。
まずはオブジェクト指向がどのようなものであるかを理解するべきです。

yuma

Re: (C++)クラスAのメンバであるクラスaの継承

#9

投稿記事 by yuma » 10年前

遅くなりましたが、お二方ご返事ありがとうございます。
自分はいわゆる「考え方」というものを知らずにC++に入ってきてしまったようですね。
ソースは訳あってさらせないのですが、そもそもクラスaの設計がおかしかったように思えます。

とりあえずもっと大きな観点からプログラミングを勉強していこうと思います。
アドバイスありがとうございました。

閉鎖

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