teratail header banner
teratail header banner
質問するログイン新規登録
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1879閲覧

[cpp]子と親の相互変換

BeatStar

総合スコア4962

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/08/10 02:31

編集2018/08/10 07:56

0

0

趣味で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++

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PineMatsu

2018/08/10 07:47

Qtのタグも付けておいたほうが良いと思います。
BeatStar

2018/08/10 07:57

追加しました。C++独自( Javaとかにもありうるのかもしれませんが ) の問題というか、私がC++の基礎を理解していないだけだと思ったので追加していませんでした。
guest

回答2

0

Resource::Font f = button1->font();
上記を実現したいだけであれば、operetor = (const QFont &)を定義すれば良さそうですが、そういうことじゃない?

投稿2018/08/10 05:55

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

これがあなたのやりたいことか?

C++

1#include <iostream> 2using namespace std; 3 4class Parent { 5protected: 6 int n; 7public: 8 Parent(int v) : n(v) {} 9 virtual ~Parent() {} 10 void p_fun() { cout << n << " : Parent's method\n"; } 11}; 12 13class Child : public Parent { 14public: 15 Child(int v) : Parent(v) {} 16 void c_fun() { cout << n << " : Child's method\n"; } 17} ; 18 19#include <vector> 20 21int main() { 22 vector<Parent*> data; 23 data.push_back(new Parent(1)); 24 data.push_back(new Child(2)); 25 data.push_back(new Parent(3)); 26 data.push_back(new Child(4)); 27 28 for ( Parent* p : data ) { 29 p->p_fun(); 30 // Parent* をChild* にcastする。(できなかったらnullptr) 31 Child* c = dynamic_cast<Child*>(p); 32 if ( c != nullptr ) { 33 c->c_fun(); 34 } 35 } 36} 37 38/* 実行結果 391 : Parent's method 402 : Parent's method 412 : Child's method 423 : Parent's method 434 : Parent's method 444 : Child's method 45*/

投稿2018/08/10 05:11

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2018/08/10 05:49

たぶんそうだと思います。 dynamic_cast<>かぁ。ちょっと試してみますね。
episteme

2018/08/11 00:29 編集

少なくともひとつ、仮想関数を持つべし。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問