クラスaをメンバとして含むクラスAがあります。
そこでクラスaを継承したクラスa' をつくりました。
この後、クラスa' をメンバとするクラスA' を作る際、
クラスA' をクラスAの継承とすることはできるのでしょうか?
できるのならばどうすればいいのでしょうか?
(C++)クラスAのメンバであるクラスaの継承
Re: (C++)クラスAのメンバであるクラスaの継承
コメントありがとうございます。
ちょっと説明が不十分でしたね。
そりゃ無理やりならできますが...
というのを
というコードに書き直したいのです。
ちょっと説明が不十分でしたね。
そりゃ無理やりならできますが...
class a {
public:
//
private:
int x;
int y;
};
class A {
//
public:
a a_;
};
A function(){
static A A1;
//
return A1;
}
というコードに書き直したいのです。
Re: (C++)クラスAのメンバであるクラスaの継承
A_dashのa_はあくまでもa型なので、
A_dash1.a_.yn
にはアクセスできません(A_dash1.a_の中にynが存在しません)
何がやりたいのか良く分かりませんが、推測するに
「Aのクラス定義はそのままで、Aにメンバを追加したい」のでしょうか?
聞いてる限りですと、とても無理筋なクラス設計を考えているように思います。
A_dash1.a_.yn
にはアクセスできません(A_dash1.a_の中にynが存在しません)
何がやりたいのか良く分かりませんが、推測するに
「Aのクラス定義はそのままで、Aにメンバを追加したい」のでしょうか?
聞いてる限りですと、とても無理筋なクラス設計を考えているように思います。
Re: (C++)クラスAのメンバであるクラスaの継承
一般論ですが、アップキャストというのは「参照」とか「ポインタ」で使う技術です。
functionの戻り値がA*であったなら、似たようなことは出来るかもしれませんね
A_dash1.a_を実インスタンスではなく、aへのポインタ型として宣言していると仮定しています。
そして、A_dashのコンストラクタでa_に対し、a_dash型インスタンスへのポインタを設定します。
こんな感じでしょうか?(コンパイル確認してませんが悪しからず)
無理やりやってみましたが、あまり良い設計ではないと思います。
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_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の継承
なるほど、やはり無理がある気がしますね。
コードありがとうございます。
ところで、自分はクラス設計とかに関してほとんど無知ですのでお聞きしたいのですが、
「Aのクラス定義はそのままで、Aにメンバを追加したい」、のは無理筋と書かれていますが、
これは「継承」の考え方ではないのでしょうか?
コードありがとうございます。
ところで、自分はクラス設計とかに関してほとんど無知ですのでお聞きしたいのですが、
「Aのクラス定義はそのままで、Aにメンバを追加したい」、のは無理筋と書かれていますが、
これは「継承」の考え方ではないのでしょうか?
Re: (C++)クラスAのメンバであるクラスaの継承
「継承」はあくまでも、「新しいクラスを作って」メンバを追加する、のです。
を見る限り、クラス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なるクラスが存在する、ただそれだけです。
お示しになられたソースコードでは、何をやりたいのか(少なくとも僕には)全然伝わりませんので、
本当のソースコードを示すか、ご自分でより良い設計を発見するかしてください。
を見る限り、クラス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の継承
beatleさんの書いたこの箇所が、C++の肝である「オブジェクト指向」ですよ。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なるクラスが存在する、ただそれだけです。
まず、これを感覚的に理解していればこのような質問は出ないはずです。。
まずはオブジェクト指向がどのようなものであるかを理解するべきです。
Re: (C++)クラスAのメンバであるクラスaの継承
遅くなりましたが、お二方ご返事ありがとうございます。
自分はいわゆる「考え方」というものを知らずにC++に入ってきてしまったようですね。
ソースは訳あってさらせないのですが、そもそもクラスaの設計がおかしかったように思えます。
とりあえずもっと大きな観点からプログラミングを勉強していこうと思います。
アドバイスありがとうございました。
自分はいわゆる「考え方」というものを知らずにC++に入ってきてしまったようですね。
ソースは訳あってさらせないのですが、そもそもクラスaの設計がおかしかったように思えます。
とりあえずもっと大きな観点からプログラミングを勉強していこうと思います。
アドバイスありがとうございました。