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

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

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

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

Q&A

解決済

1回答

3511閲覧

GUIアプリ開発でクラス間のデータ共有方法について

gochuumonha

総合スコア74

C++

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

0グッド

0クリップ

投稿2016/12/10 08:05

編集2016/12/10 08:08

wxWidgetsを使って、GUIアプリケーションを開発しています。フレーム内に複数のウィンドウを作成し、それぞれのウィンドウ内でopenglを使って描画を行うということをしています。このとき、2つのウィンドウで同じ3Dモデルのデータを使用したいと思ったのですが、下の図に示すようにwxWidgetsはウィンドウごとにクラスを作成しているため、クラス間でデータをやり取りしなければならなくなりました。(それぞれのクラス(GLCanvas1とGLCanvas2)の両方から3Dデータを変更できるようにしたいと思っています。)何かクラス間でデータの良い共有方法があれば教えていただきたいと思い質問させていただきました。

イメージ説明

グローバル変数を用いるとそれぞれのクラスから同時アクセスされる恐れがある上に、保守面で問題がありそうなので難しいと考えました。
また、それぞれのクラスで3Dモデルのデータを入れた構造体オブジェクトを作成し、片方のクラスでデータに変更があるたびにもう片方のクラスのデータも書き換える。ということも考えましたが、変更があるたびにいちいちデータを書き換えていたら無駄なコストがかかっているのではないかと考えました。

初めてのGUIアプリケーション作成なので、使い方や仕様に理解不足や見当違いの部分があるかもしれませんが、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

MVC(Model-View-Control)モデルという考え方があります。 Model はデータの実体を管理します。 View はそれをユーザに見せるしかけです。 Control ユーザの操作やデータの更新イベントをトリガとして実行されるアクションです。

このとき、2つのウィンドウで同じ3Dモデルのデータを使用したいと思ったのです

MVCモデルで言いますとこの「2つのウィンドウ」は View であり、「同じ 3Dモデル」は Model となります。そして、 View のクラスとは別に Model のクラスを作ります。 Cotrol でアクションが発行されたとき、 View はその表示にのみ専念し、 Model はそのデータが矛盾しないように更新することに専念するように作成します。

たとえば、ユーザが図形を右クリックして 90度回転するという操作を行うと、
0. Control のクラス(のインスタンス)が Model のクラス(のインスタンス:一つしかない)に90度回転のメッセージを送ります
0. Model のクラス(のインスタンス)がデータの状態をみて 90 度回転することが可能かどうかをチェックし、 90 度回転したらどうなるかを計算し、その結果をメモリに保存します
0. Model のクラス(のインスタンス)からそのモデルを表示中のすべての View のインスタンス(複数ありえることに注意)にモデルが更新されたことを通知するメッセージを発信します
0. メッセージを受信した View のインスタンスは更新内容に従って表示を更新します

投稿2016/12/10 12:06

mit0223

総合スコア3401

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

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

gochuumonha

2016/12/11 06:20

わかりにくい質問だったと思いますが回答していただきありがとうございますm(_ _)m MVCモデルについて調べてみたのですが、Modelクラスの作り方がわからなかったのでお聞きしてもよろしいでしょうか。 以下のようなイメージでよいのでしょうか? //Model.h class Model { private: int num; public: void setNum(int n); void getNum(); }; //Model.cpp #include Model.h Model model = new Model(); //Model model; だけでいい? void Model::setNum(int n) { num = n; } void Model::getNum() { return num; } //A.cpp #include Model.h void A::sample() { int n = 5; model.setA(n); } ~省略~
mit0223

2016/12/11 07:23

はい、例にあげられているので、良いと思います。これを複数のビュー(GLCanvas1, GLCanvas2)から共有します。エンドユーザが片方のビュー(たとえば、GLCanvas1)から更新操作をすると model.setNum が呼ばれて、モデルの値が変わり、次にもう一方のビュー(GLCanvas2)に更新されたことが通知されると、ビューはモデルを参照して表示内容を更新します。 例のコードですと、setter と getter しかないので、いまいちクラスに分離する意味がわかりにくいかもしれませんが、サーバやファイルの内容と同期したり、複数のビューから無理な更新を禁止したりするのはモデルの責任になります。
gochuumonha

2016/12/11 07:51

勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問