ページ 1 / 1
(C++)クラスAのメンバであるクラスaの継承
Posted: 2013年12月27日(金) 06:37
by yuma
クラスaをメンバとして含むクラスAがあります。
そこでクラスaを継承したクラスa' をつくりました。
この後、クラスa' をメンバとするクラスA' を作る際、
クラスA' をクラスAの継承とすることはできるのでしょうか?
できるのならばどうすればいいのでしょうか?
Re: (C++)クラスAのメンバであるクラスaの継承
Posted: 2013年12月27日(金) 08:50
by beatle
そのクラス構造に意味があるのか、良い設計なのかは別として、技術的には何も問題なくできると思います。
コード:
class a {};
class A {
a a_;
};
class a_dash : public a {};
class A_dash : public A {
a_dash a_dash_;
};
Re: (C++)クラスAのメンバであるクラスaの継承
Posted: 2013年12月27日(金) 09:35
by yuma
コメントありがとうございます。
ちょっと説明が不十分でしたね。
そりゃ無理やりならできますが...
コード:
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;//変えたくない。
}
というコードに書き直したいのです。
Re: (C++)クラスAのメンバであるクラスaの継承
Posted: 2013年12月27日(金) 10:18
by beatle
A_dashのa_はあくまでもa型なので、
A_dash1.a_.yn
にはアクセスできません(A_dash1.a_の中にynが存在しません)
何がやりたいのか良く分かりませんが、推測するに
「Aのクラス定義はそのままで、Aにメンバを追加したい」のでしょうか?
聞いてる限りですと、とても無理筋なクラス設計を考えているように思います。
Re: (C++)クラスAのメンバであるクラスaの継承
Posted: 2013年12月27日(金) 10:31
by beatle
一般論ですが、アップキャストというのは「参照」とか「ポインタ」で使う技術です。
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()) {}
};
こんな感じでしょうか?(コンパイル確認してませんが悪しからず)
無理やりやってみましたが、あまり良い設計ではないと思います。
Re: (C++)クラスAのメンバであるクラスaの継承
Posted: 2013年12月27日(金) 10:56
by yuma
なるほど、やはり無理がある気がしますね。
コードありがとうございます。
ところで、自分はクラス設計とかに関してほとんど無知ですのでお聞きしたいのですが、
「Aのクラス定義はそのままで、Aにメンバを追加したい」、のは無理筋と書かれていますが、
これは「継承」の考え方ではないのでしょうか?
Re: (C++)クラスAのメンバであるクラスaの継承
Posted: 2013年12月27日(金) 13:10
by beatle
「継承」はあくまでも、「新しいクラスを作って」メンバを追加する、のです。
コード:
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なるクラスが存在する、ただそれだけです。
お示しになられたソースコードでは、何をやりたいのか(少なくとも僕には)全然伝わりませんので、
本当のソースコードを示すか、ご自分でより良い設計を発見するかしてください。
Re: (C++)クラスAのメンバであるクラスaの継承
Posted: 2013年12月27日(金) 15:45
by sql
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++の肝である「オブジェクト指向」ですよ。
まず、これを感覚的に理解していればこのような質問は出ないはずです。。
まずはオブジェクト指向がどのようなものであるかを理解するべきです。
Re: (C++)クラスAのメンバであるクラスaの継承
Posted: 2013年12月28日(土) 01:38
by yuma
遅くなりましたが、お二方ご返事ありがとうございます。
自分はいわゆる「考え方」というものを知らずにC++に入ってきてしまったようですね。
ソースは訳あってさらせないのですが、そもそもクラスaの設計がおかしかったように思えます。
とりあえずもっと大きな観点からプログラミングを勉強していこうと思います。
アドバイスありがとうございました。