趣味でC++やっています。
Qtというライブラリ ( Widget ツールキット ) を使っています。
基礎的な問題なのですが、ちょっと混乱しています。
Qtで用意されているクラスがあり、そのクラスは個人的に使いにくいので継承して使いやすくしています。
( コンポジションでもいいですが、ポリモーフィズムを行えるようにしたいので なるべく継承で。 )
例えば Qtには QFont というフォントを扱うクラスがありますが、個人的に使いにくい ( メンバ関数名が...わかりにくい... )
ので、
C++
1namespace Resource{ 2 class Font : public QFont{ 3 public: 4 Font() = default; 5 virtual ~Font() = default; 6 7 void setFontSize( int s ){ QFont::setPointSize( s ); } 8 ... // 他にもいろいろ 9 }; 10}
とします。
で、Qtが提供しているコントロール系のクラスでは QFontを返したりQFontを引数に受け取ったりします。
コンポジションならそのまま返せばいいですが、継承によるものは親 -> 子, 子 -> 親 ってできないでしょうか?
Parent* p = new Child();
とか
std::vector<Parent*> v;
v.push_back( new Child() );
という風にできることから、子 -> 親 はできますが、親 -> 子 はどうなのでしょうか?
私が試した方法だと、
(以下、条件がない限り、最初に提示したResource::Fontクラスに追加したとする)
方法1: QFont font( void ) const{ return this; } 方法2: QFont& font( void ) const{ return &this; }
...ともうちょっとありますが、&演算子や*演算子を付けたり外したり...です。
なぜ今回の質問である 親 -> 子 が必要かというと、
例えば QPushButtonクラスがあり ( in Qt )、そのメンバである font() は QFontを返します。
ですが、個人的には使いにくいので
// QPushButton* button1 として
Resource::Font f = button1->font();
もしくは
Resource::Font f;
f.setFont( button1->font() );
のようにしたいのです。できれば =演算子でやる方で。
[情報]
言語: C++
回答2件
あなたの回答
tips
プレビュー