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

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

新規登録して質問してみよう
ただいま回答率
85.50%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

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

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

2回答

2781閲覧

クラスベースのオブジェクト指向でデバイス周りを作りたい

tiwatiwa

総合スコア70

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

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

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

1クリップ

投稿2016/02/04 12:58

編集2016/02/22 14:38

C++とDirectXでゲームを作っています。

クラスベースのオブジェクト指向で作りたいと思っていますが、デバイス関連のプログラムはどう書けばいいのでしょうか?

デバイスで想定しているのは以下のようなものです。
・ウィンドウ描画関連
・3Dグラフィックス描画
・入力系(キーボード、マウス、ゲームパッド)
・サウンド系
・通信系(TCP/IP通信)
などなど

すべて1つしかいらないオブジェクトなのでシングルトンにしようと思ったのですが、すべてがシングルトンでも気持ち悪いなと思っています。
でも、グローバルにはしたくないし、デバイス関連だけクラスを使わないのも気持ち悪い。

なんでもいいのでコメントしていただけると嬉しいです。
よろしくお願いします。

[追記]
後で思いついたのですが、デバイスクラスを作って、メンバをすべてstaticにするのは邪道でしょうか??

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

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

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

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

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

guest

回答2

0

ベストアンサー

入力系(キーボード)まわりの実装を、オブジェクト指向だけで考えてみました。
(C++の言語仕様に関わる部分は、詳しくないのであまり考えられておりません…)

デバイスがシングルトン的な実装を必要としている(2つ取ると一方が無効になるとか)のであれば、
シングルトンがよいと思います。

1:想定されるキーボードの操作を、インターフェースとして定義する(IKeyborad)。

2:IKeyboardを生成するファクトリのインターフェースを定義する(IKeyboardFactory)。

3:実ハードウェアのキーボード入力を扱うクラスを、
IKeyboardの実装として作成する(KeyboardByHuman)。

4:KeyboardByHumanをシングルトンで生成するファクトリを、
IKeyboardFactoryの実装として作成する(KeyboardByHumanFactory)。

ここでKeyboardByHumanをKeyboardByHumanFactoryのprivateな内部クラスとすると、
KeyboardByHumanの生成を制限できる(と思います)。
(この場合、KeyboardByHumanのテストには工夫が必要かもしれません)

↑↑↑ここまで実装↑↑↑
↓↓↓ここから使用↓↓↓

5:キーボードの入力を必要とするクラス(例えば、シューティングゲームでの飛行機)
のコンストラクタの引数(もしくはセッター)に、IKeyboardFactoryを指定する。

6:飛行機のクラスの内部でIKeyboardFactory.createKeyboardでIKeyboardを取得し、
キーボードの入力に従い飛行機を動かす。

7:飛行機クラスのテスト時には、テスト用のIKeyboradを実装したクラスと、
そのクラスを返すIKeyboardFactoryを実装したクラスを渡してテストする。

8:飛行機クラスの生成も飛行機ファクトリで行い、
例えば、デフォルトでKeyboardByHumanFactoryを渡すように作成する。

IKeyboardFactoryにこだわる理由は…
1、IKeyboardインターフェースでは、インスタンスを取得する(staticな)メソッドを定義できないから。
2、そもそもIKeyboardはキーボード(の操作)を表したもので、生成とは関係がないから。
3、コンストラクタに引数が多かったり生成時のお約束が面倒でも、ファクトリだけが行えばよいから。
4、KeyboardByHumanの生成破棄が自由に行えるようになり、テストも行いやすくなるから。

IKeyboardにこだわる理由は…
1、飛行機クラスのテストと操縦方法やデバイスの変更が容易になるから。
十字キーを表現しただけのIKeyboardなら、例えばゲームパッドに切り替えることもできます。

投稿2016/02/05 09:52

i50

総合スコア227

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

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

0

こんにちは。

クラスベースのオブジェクト指向で作りたいと思っていますが、デバイス関連のプログラムはどう書けばいいのでしょうか?

普通にクラスで作ってグローバル変数でインスタンスを保持すればよいと思いますよ。

多くのクラスから使いたくて1つしかインスタンスがないのなら、安易にグローバルでよいのではないでしょうか? なんでもかんでもグローバル変数にしていいわけはないですが、上記条件を満たすものをグローバル変数にすることは妥当と思います。
逆に何でもかんでもメンバ変数で定義し、必要とするインスタンス全てへパラメータでいちいち受け渡すのも良くないですし。

もし、tiwatiwaさんのプロジェクトが大きくて、グローバル変数を使うべき時に間違って自分でコンストラクトされる可能性を懸念する場合は、シングルトンにして生成/コピー/ムーブを防げば結構安心ですね。

デバイス制御は通常データ構造とアルゴリズムが密接にからみますから、クラスにしないのは問題外です。

投稿2016/02/05 01:25

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問