ものの本には『データはドキュメントクラスで管理し、ビュークラスではそこからデータをもらってくる』とし、データをドキュメントクラスのメンバ変数で作ることを推奨しているのですが、
データをファイルから読み込み、ビュークラスで表示、加工するようなアプリケーションにおいて、
(a) データをドキュメントクラスのメンバ変数(public)で作る、
(b) データを外部変数で作りどこからでも参照変更できるようにする、
でどう違うのでしょうか。
c/c++初心者です。よろしくお願いします。
No.2ベストアンサー
- 回答日時:
どうしても言語から入ってしまうと言語仕様として
どちらも出来てしまうので迷いますよね。
違いというと。。。
そのメンバ変数なり外部変数をアプリケーション上で
参照出来る期間(変数実体の寿命?)を考えてみます。
(a)の場合まずドキュメントオブジェクトのインスタンスが存在する間。
(b)はアプリケーション起動~終了迄。
となります。
変数をpublicなり外部変数なりにした場合の弊害について
はsssoheiさんがおっしゃっている通りです。
オブジェクトを使ってアプリケーションを実装する考え方
(オブジェクト指向ですね)を身につけてください。
そちら側から考えてみるとわかりやすいですよ。
所詮言語は実装を表現する手段にすぎないのですから。。。
この回答への補足
ありがとうございます。変数の違いについては理解できた(つもり)と思います。
で、MFC AppWizardが生成したコードをさらっと眺めてみたのですが、CxxDocの宣言らしきものが見当たりません。CxxDocのオブジェクトはどこで作られ、いつ消えるのでしょうか。
CxxView::OnDraw(CDC* pDC)の中で、
CxxDoc* pDoc = GetDocument();
がありますが、ここですか?
的をはずれは質問のような気がしますが、初心者に免じ、よろしくお願い致します。
No.5
- 回答日時:
> > 内蔵をみせながら歩くようなもの
> みせるけどいじられることはない、ということですか?
説明が不適切でした^^;ごめんなさい。
publicな変数は外からいじることが出来るので、どちらの場合もいじれますね^^;
なお、(すこし正確ではありませんが)関数(インターフェース)を通じてメンバ変数にアクセスする様にする事を「カプセル化」と言います。
「中身を気にしなくても良くなる」というのが効用です。
# 作者を信頼すれば、、ですが。
例えば、ラジカセを操作するのに、CDを入れて、再生ボタンを押す。という事だけ知っておけばいい。ですよね。このとき。「CDを入れる」、「再生ボタンを押す」と言うのがインターフェースを通じた処理な訳です。
「ラジカセ」は「クラス」
「CDを入れる、再生ボタンを押す」はメンバ関数に相当します。
メーカーを信頼すれば、ラジカセがどのように動作しているかを気にする必要はありません。
CDの状態によってレーザーの強さを調節したりするのはラジカセに任せてしまいます。
外から、人がいじれると、下手したら壊れてしまうかも知れません。
# 分かってる人(制作者)にとっては、いじれた方が良いのかも知れませんが、全体から見れば、いじれない方が良いわけです。
他の部分も同様です。
そのため、パッケージで包んで、さわれなくしてある。と言うわけです。
こうすれば、外部からの介入の可能性を絞れますので、内部に処理を書きやすくなる、と言うわけです。
説明がうまく出来ず、長文になってしまいました(本当に、ごめんなさい。
馴れると感覚的に良さが分かってくると思います。
オブジェクト指向は概念的にはわかっているつもりなんですが、いざコードを書く段になると、どこからでも何でもいじりたくなってしまいます。
いろいろな例題でもっと慣れる必要があると思います。
親切な説明を頂き、感謝しております。
No.4
- 回答日時:
>CxxDoc* pDoc = GetDocument();
これはビューにと結びついているドキュメントオブジェクトのポインタを取得しています。
ドキュメント、ビューのオブジェクトインスタンスを生成
しているのはMFCの内部が行っています。
このあたりについてはここで書くにはたいへんなので、
MSDNヘルプの「ドキュメント、ビューアーキテクチャ」
のあたりを見てください。
またはCXXXDocのコンストラクタにブレークポイント
張って止まったら、「コールスタック(Alt+7キー)」
でどこから呼ばれているか見てみるのも良いかもしれません。
MFCでプログラムを書くのは、私の場合、お釈迦様の手のひらでおサルさんが遊ぶようなものみたいですね。
もう少し勉強してみようと思います。
いろいろ丁寧に説明いただき、ありがとうございました。
No.3
- 回答日時:
> publicメンバ変数と、外部変数(正式名称かどうかわかりませんが、関数の外で定義する変数)
グローバル変数で良いと思います>呼び方
それはさておき、グローバル変数は使わない、というのが現在の主流です。>メリットよりもデメリットが大きいので
どうしても使いたいというような場面が思い当たらないのですが、いかがでしょうか?^^;
なるべく、作る人間が楽になるような方法をとっていかないと、なかなか大変だと思います。
C++はCの流れを踏んだ言語なので、残っている遺物的な(というと言い過ぎかも知れませんが)言語仕様も残っています。
ちょっと極端な例えですが、
「データをドキュメントクラスのメンバ変数(public)で作る」というのは、内蔵をみせながら歩くようなものです。
「データを外部変数で作りどこからでも参照変更できるようにする」というのは、目の前に誰もいなくても、いつの間にか財布の中身がかわってしまったり、体の中をいじられてしまったり、、を出来るようにするようなものです。
No.1
- 回答日時:
大抵、データをドキュメントクラスのprivateメンバ変数にしておいて、publicなメンバ関数で間接的に操作します。
>カプセル化はじめは面倒なように感じるかも知れませんが、悪質なバグが減ることが多く、非常に効率の上がることが多いです。
この様にすることで思わぬ書き換えを防ぐコードを入れたり、と色々管理がしやすくなります。
関連している物がまとまっている方がわかりやすいと思うのですが、いかがでしょうか?
また、データはそれぞれのクラスに密接に結びつくので、必要な所に、必要なだけ利用出来るというわけです。
ドキュメント/ビューアキテクチャに限らず、C++全般に対して重要な考え方だと思います。
この回答への補足
privateメンバ変数+publicメンバ関数が有効だということは何となく理解できました。
publicメンバ変数と、外部変数(正式名称かどうかわかりませんが、関数の外で定義する変数)はどのように使い分けるのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(クラウドサービス・オンラインストレージ) データ保存先をOneDriveからPC本体に変えたらDocumentとPictureフォルダが消えた 1 2023/07/30 15:48
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
- Excel(エクセル) [Excel2016] 相関表等の自動作成 2 2022/08/01 20:34
- Windows 10 フォルダの新規作成を必ず「ドキュメント」にする方法 1 2023/06/24 09:08
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Excel(エクセル) Excelのテーブルについて 6 2023/07/07 08:37
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- JavaScript gasについて 1 2022/05/31 21:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エディットコントロールのイベ...
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
個々の関数について継承してい...
-
C++では構造体がメンバ関数をも...
-
クラスのアドレスを引数として...
-
MFCアプリのコマンドラインでパ...
-
MessageBoxを継承したい
-
OnInitDialog()の関数の組み込み方
-
form1 から form2 へのデータの...
-
イベントにAddHandlerされてい...
-
IncludeではなくClassで宣言す...
-
(UWSC) 「#32770」の意味わかり...
-
スプラッシュコントロールの挿...
-
C++ protectedにアクセス不可
-
フォーム間でのオブジェクト又...
-
コンソールアプリでのクリップ...
-
MFCのドラッグ&ドロップについて
-
C++でJavaのStaticイニシャライ...
-
変数の後の点々
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
クラスのアドレスを引数として...
-
ダイアログ表示時にチェックボ...
-
イベントにAddHandlerされてい...
-
【ASP.NET】 独自で作成したク...
-
MFCアプリのコマンドラインでパ...
-
DebugクラスとTraceクラスの違い
-
ボタンのオーナードローについて
-
OnInitDialog()の関数の組み込み方
-
IncludeではなくClassで宣言す...
-
関数の呼び出し元の検索
-
このコンパイルエラーの意味に...
-
C++ protectedにアクセス不可
-
C++で継承元のクラスの代入演算...
-
DataGridViewのセルに斜線を引...
-
C#で通常のbuttonコントロール...
-
エディットコントロールのイベ...
-
CMainFrameクラスの使い方
おすすめ情報