質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
C++

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

Q&A

解決済

3回答

983閲覧

C++ でのアプリケーション設計について

harpy

総合スコア42

C++

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

0グッド

0クリップ

投稿2019/06/20 07:53

編集2019/06/20 08:12

#C++でのコーディング?設計について

正直に申し上げると、これが設計の問題なのかコーディングの問題なのかあるいはそのどちらも含んだ問題であるのかがよくわかっておりません。

現在VC++で簡単なアプリケーションを作っております。
今はウィンドウズアプリケーションなどでよくある「設定」や「環境設定」などを実装しようとしています。

設定ダイアログを呼び出して、各種の設定をラジオボタンやエディットボックスなどで行えるようにしたいです。

##作成したいもの

設定した情報をアプリケーションの実行中は保持されるようにしたいのですが、どのようにすればいいのでしょうか?

情報を保持する用のクラスを作成し_tWinMainでインスタンス化して......???

MFCを使っています?

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

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

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

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

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

takabosoft

2019/06/20 08:01

アプリを作る際にフレームワーク等を使用しているのであれば、それらも記述してください。WTL/MFC等。
harpy

2019/06/20 08:10

回答ありがとうございます。 使用しているのはMicrosoft Visual C++ でMFCを使っているのかどうかはどうやって調べるのでしょうか? 一応自分でしらべて、ここを見ればMFCを使っているかどうかを判断できるというところは載せなおします。使っていると思います。
takabosoft

2019/06/20 08:13

例えばプロジェクトのプロパティ→構成プロパティ→全般→MFCの使用 という欄が”共有DLLでMFCを使う”とかになっていれば使っているかもしれません。
takabosoft

2019/06/20 08:14

ついでにVisual Studioのバージョンも記載してもらった方がいい気がしました。
harpy

2019/06/20 08:16

VC++ 2010ですよろしくお願いいたします。
takabosoft

2019/06/21 01:01 編集

MFC使っていないですね〜。
harpy

2019/06/20 08:20

なるほど 「標準Windowsライブラリを使用する」ではMFCを使用しないのですね。 ご指摘ありがとうございます。
guest

回答3

0

ベストアンサー

こんにちは。

アプリケーション全体の振る舞いを設定するのであれば、グローバル変数やシングルトンなどが妥当と思います。
そのようなケースで、設定値をアクセスしたい関数やクラスへパラメータで渡す場合、実際に使わないのに呼び出し経路にある関数群にも渡して中継する必要があり、可読性が悪化することが少なくありません。

設定値を管理するクラスだけを定義するヘッダを設け、設定値を使用するソースのみが#includeすることでアクセス範囲を限定するのも有効です。

投稿2019/06/20 08:13

編集2019/06/20 08:13
Chironian

総合スコア23272

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

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

0

こんにちは。

その設定を使う、一番長生きしているクラスか何かに便乗してメンバー変数等で値を保持しておくのが楽ではあります(アプリケーションクラスやメインウィンドウクラスなど)。

(他にもグローバル変数やシングルトンといったやり方もありますが、あまり推奨されていないらしいです。)

投稿2019/06/20 08:00

takabosoft

総合スコア8356

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

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

harpy

2019/06/20 08:32

いただいた回答について一つ質問があります。 >(他にもグローバル変数やシングルトンといったやり方もありますが、あまり推奨されていないらしいです。) とありますが、どのような理由からでしょうか? 調べたところ、アプリケーション全体で使う設定値などはSingletonで持たせることがよくあると書いてありました。(ただ、クラス間の結合が強くなってしまうから慎重に。。とは書いてありました。これが理由でしょうか?)
takabosoft

2019/06/20 09:04

> どのような理由からでしょうか? ぶっちゃけ私自身、自分のアプリではシングルトンをたまに使っていまして、そういった「singletonは害悪」的な記事を見て、なんとなく良くなさそうだな・・・程度の認識のもとに書いています(^_^;)すみません。 よく言われているのは単体テストなどの妨げになりやすいという点です。 例: https://プログラマが知るべき97のこと.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%88%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E8%AA%98%E6%83%91%E3%81%AB%E8%B2%A0%E3%81%91%E3%81%AA%E3%81%84/ 環境設定はそもそもアプリ全体の動作を変えるものでしょうからシングルトンでも良いと思いますけどね。
stdio

2019/06/20 09:16

その通りです。 グローバル変数やシングルトンが推奨されていない理由は、多重定義やどこで呼ばれたのかしっかりと管理しにくい等の問題が発生しやすいからです。開発が大規模になればなるほど、やらかしてしまうと取り返しのつかない結果になってしまいます。
harpy

2019/06/21 04:06

ありがとうございます。 今回は簡単なプログラムであり、大規模になる可能性はないといえますのでシングルトンで実装してみます。 回答ありがとうございました。
guest

0

設定値は

  • 都度,引数等で渡す
  • 設定値を参照する人には,「設定値を取得する手段」をあらかじめ指定しておく(こういうのをDIとか呼ぶのだろうか?)

とかしておけば良いと思いますが,
そういう形が(何らかの理由で)嫌で
とりあえずどこからでもアクセスできるようにしたいだけなら
(シングルトンがどうのとか言ってインスタンスの個数まで制限する必要は無いと思うので)
単にこんな感じにしておけばどうでしょうか.

//[AppSetting.h] #pragma once //Appの設定値 class AppSetting { public: AppSetting() : A(0), B(2), C(7) {} public: //設定値の状態が,APPの設定として妥当か否かをチェックする手段 bool IsValid() const { if( A<-2 )return false; //設定値Aは-2以上じゃないと不正 if( B & 0x01 )return false; //設定値Bは偶数である必要がある return true; } public: //設定値の方々 int A; unsigned int B; int C; }; //現在の設定値の取得 const AppSetting &GetCurrAppSetting(); //設定値の変更 bool ChangeAppSetting( const AppSetting &NewSettingVals );
//[AppSetting.cpp] #include "stdafx.h" //VC #include "AppSetting.h" namespace { AppSetting CurrAppSetting; } //現在の設定値の取得 const AppSetting &GetCurrAppSetting(){ return CurrAppSetting; } //設定値の変更 bool ChangeAppSetting( const AppSetting &NewSettingVals ) { if( !NewSettingVals.IsValid() )return false; CurrAppSetting = NewSettingVals; return true; }

投稿2019/06/21 02:13

編集2019/06/21 02:17
fana

総合スコア11663

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問