MFC:CDialogExについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
CODE BABA
記事: 5
登録日時: 8年前
連絡を取る:

MFC:CDialogExについて

#1

投稿記事 by CODE BABA » 8年前

新年明けましておめでとうございます。
CODE BABAと申します。
現在 VisualStudio2015でMFCを使ってソフトを作っております。
MFCに関しては初心者でサイトで調べながらちまちまと作っている感じです。
一応情報系の学生です。

本題になりますが”~~Dlg.cpp”中にある”CDialogEx”の役割についてお聞きしたくて投稿しております。
ダイアログにボタンを設置したのち、右クリックから変数を追加すると下の様にCDialogEx内に処理が追加されます。見る限りでは初期化をしているように見えるのですが、初期化は宣言時に行えばそれが反映されているのでここで初期化をする理由がわかりません。また、普通の初期化とは記述の方法も違います。加えて、下の様にここに配列を書くとエラーが出て’(’が必要だといわれます。ですが、その割に初期化?を含めなんら処理を記述しなくとも普通に動きます。
サイトで調べる限り背景を変えたりといったことに使えるようですが、自動で変数を追加した際にこのように記述されるということは何らかの理由があってのことかと思います。その理由を教えていただければと思います。

コード:

C~~Dlg::CMultiClipDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(IDD_MY_DIALOG, pParent)
	///////////////////
	//, m_button[0](_T(""))
	, m_nextLineOr1(TRUE)
	, m_textUpdate1(FALSE)
	, m_comme1(_T("ここにコメントを記述できます"))
	{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

Bull
記事: 149
登録日時: 10年前

Re: MFC:CDialogExについて

#2

投稿記事 by Bull » 8年前

オフトピック
C++言語の文法とMFCの流儀とは区別して考えた方いいと思います。
MFCもC++のクラスライブラリですので、その範疇で作られてる
はずですが。
まず、普通 MFC でダイアログを作る時は、CDialog(Ex)から派生させた
クラスでダイアログを作ります。CMultiClipDlgは CDialogEx の派生
クラスでよね。CMultiClipDlgのコンストラクターで基底クラスである
CDialogEx を初期化しています。


ウィザードで変数を追加した時に、初期化リストに追加されるのは、
コンストラクターでメンバー変数を初期化するのは、それが自然な事
と(Visual Studioが)考えているからでしょうか。

私もそれほど不自然な事とは思っていません。まあ当のプログラマー
が必要ないと考えているなら、余計なお世話かもしれませんが。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: MFC:CDialogExについて

#3

投稿記事 by ISLe » 8年前

CDialogEx内に処理が追加されるというのは勘違いですね。
既に指摘されているとおり2行目は基底クラスの初期化
5~7行目はメンバの初期化
各行それぞれ異なる対象を個別に初期化しています。


メンバの宣言はヘッダファイルで行うのが一般的です。
ヘッダファイルはそのダイアログの実装を行うソースファイルでインクルードするのはもちろん、そのダイアログにアクセスする他のソースファイルでもインクルードします。
ヘッダファイルを書き換えればそれらソースファイルが再びコンパイルされ時間を消費します。

ちなみに非静的メンバを宣言時に初期化できるようになったのは、規格ではC++11以降、VisualStudioでは2013以降です。

CODE BABA
記事: 5
登録日時: 8年前
連絡を取る:

Re: MFC:CDialogExについて

#4

投稿記事 by CODE BABA » 8年前

Bull様、ISLe様、返信ありがとうございました。成程、、おおよそは理解できたように思います。
どうやら必ずしも必要ではないようなので消しちゃうことにしました。
それで一応解決ということにしておきます。

それから、C++は大学でそこそこ習っておりますのでMFCと一般的なC++の違いは感じているところです。

ところで、ここで配列の初期化は出来ないものでしょうか?これまでは宣言時に初期化できなかったということですが、必要があればどこかにクッションを置いてそこで代入していたということですよね?記述方が代入式でなくてわかりにくいですし、必ずしも初期化の記述を強制しなければいけないというものでもないと思います。それに仕様か私の知識不足かはわかりませんが配列の初期化ができないですし、、、正直ここで初期化できるようにした意図がわから無いのですが、、、

Bull
記事: 149
登録日時: 10年前

Re: MFC:CDialogExについて

#5

投稿記事 by Bull » 8年前

コンストラクターの初期化リストで、配列の初期化はできるはずです。

クラスの初期化に関しましては、以前の規格(C++98, C++03)と最近の規格(C++11, C++14)
とはだいぶ違っています。以前は初期化リストで配列の初期化はできなかったです。これに
対応したのは VC++14.0(Visual Studio 2015) からのようです。同様にクラスを定義する時
にメンバー変数を初期化できるようになったのもC++11からです。

コンストラクターでメンバを初期化するのは必要なことだと思っています。クラスの定義時
にもある程度初期化ができるのですが、クラスオブジェクト(インスタンス)の定義の時で
無いと決まらないも多々あります。例えば、参照などはオブジェクトを作るまでわかりませ
んし、const な変数だと、初期化リスで初期化する以外方法がないです。もちろん、クラス
定義時にも初期化できますが、それではメンバー"変数"にする意味があまりないです。
オフトピック
そもそもMFCが最初にできたのがかなり昔ですし、最近の規格には対応してないのでしょうね

閉鎖

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