🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

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

Q&A

解決済

6回答

672閲覧

[C++]一つのソースファイルしか使わないゲームでもグローバル変数は良くないのですか?

Tsugume

総合スコア6

C++

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

0グッド

1クリップ

投稿2019/09/22 12:17

C++初心者です。
グローバル変数は良くないとよく聞きます。
しかし、それは一つのソースファイルしか使わない簡単なゲームでも、同じくそうなのでしょうか。

簡単なゲームであっても、複数の関数からいつでも変更したい変数の必要が生じると思います。
アドレスやポインタで関数間の変数を共有する方法もありますが、その変数が多くなれば引数がえらいことになることもあります。

その際メイン関数であらかじめ、どこからでも変更したい変数を持った構造体を用意し、これを各関数に渡す方法がありますが、この方法はグローバル関数よりも効率的なのでしょうか。

調べても良く分からなかった(ゲーム制作におけるデメリットが分からなかった)ので質問させていただきます。
分かる方いらしたら教えて下さい。
よろしくお願いします。

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

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

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

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

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

guest

回答6

0

使っていけないものではない。
使い方に注意が必要なだけです。

まずは、使う必要があるか考えましょう。 それでも必要と思えば、使うだけです。

一つのソースファイルしか使わない

と言っても、人によって数千行もあったりする。 (それはそれで問題ですが)

投稿2019/09/22 12:31

pepperleaf

総合スコア6385

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

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

0

たんに考えなく多用するとまずいってだけでしょう。
必要なところには使うべきものです。

投稿2019/09/22 12:20

y_waiwai

総合スコア88038

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

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

0

ベストアンサー

グローバル変数を避けるべきであるというのは「大抵の場合によりよい設計がある」ということであって、設計手法に無知なままで闇雲にグローバル変数を避けたらおそらくグローバル変数を使うより悪くなると思います。

きちんと設計すれば自動的にグローバル変数はあまり使わなくなるでしょうが、グローバル変数を避けたからといってよりよくなるわけではないのです。

そこらへんはきちんとした設計を学んでくださいとしか言えません。

どうしてグローバル変数が好ましくないのかというと、それはモジュール性が低いことの証だからです。

プログラムの構成というのは、そのプログラムに必要な部品を作って組み合わせるというのが綺麗なやり方です。 その部品もまた更に小さい部品を組み立てるという階層的な構造を持ちます。 グローバル変数はどこからでもアクセスできるのでその階層構造をぶちぬいてしまい、分割を台無しにする可能性があります。

投稿2019/09/22 14:51

編集2019/09/22 17:05
SaitoAtsushi

総合スコア5684

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

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

0

グローバル変数は良くないとよく聞きます。

しかし、それは一つのソースファイルしか使わない簡単なゲームでも、同じくそうなのでしょうか。

元々ゲーム制作の専門学校に通っていた者の意見としては、
ゲームはタイトル画面、ゲーム画面、クリア画面、ゲームオーバー画面の最低でも4つの画面がないと、ゲームとしては認められない為、そもそも理論を交わす必要もないと思いますが....

複数の関数からいつでも変更したい変数の必要が生じると思います。アドレスやポインタで関数間の変数を共有する方法もありますが、その変数が多くなれば引数がえらいことになることもあります。

そうですね。私も10個とか引数を持つ関数を作ったことがあるので、気持ちは分かります。
クラスや構造体でget&setを使って分ける方法が一番いいと思います。

メイン関数であらかじめ、どこからでも変更したい変数を持った構造体を用意し、これを各関数に渡す方法がありますが、この方法はグローバル関数よりも効率的なのでしょうか。

嫌なら、シングルトンクラスやスタティッククラスという手もあります。
世間的には嫌われているやり方なので、お勧めはしませんが...

まず、しっかりと設計が出来ていれば、「どこからでも変更したい変数」なんて存在しなくなります...
もう少し、プログラムというよりはゲームを学びましょう。

投稿2019/09/23 01:57

stdio

総合スコア3307

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

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

0

使い方につきましては一致した回答が書かれているようですので, 視点を変えまして.

一つのソースファイルしか使わない簡単なゲームでも、同じくそうなのでしょうか。

(中略)

この方法はグローバル関数よりも効率的なのでしょうか。

現在のコンピュータの性能等から考えまして, 1つのソースしか使わない"簡単"なゲームが, グローバル変数かパラメータかで「効率」を考える必要があるようなものにはならないのではと思います.

また"初心者"という面からしましても, 現段階で単に「効率」によって実装を決め打つのでは無く, 今後コードを読み書きしていく中で「なぜパラメータなのか」「なぜグローバル変数なのか」を意識して行かれれば, おのずと使い分けができるようになるのではと思います.

投稿2019/09/22 16:30

jimbe

総合スコア13201

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

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

0

ある関数Aの動作がグローバル変数に依存している場合,その動作を制御するにはグローバル変数の値を変えるしか手段が無いわけですが,
そのために(一時的にでも)グローバル変数の値を変えても大丈夫なのか?は謎です.
(関数Aからは関数BやCが呼ばれ,そいつらも同じグローバル変数に依存しているかもしれない)

そこが「謎」ではない(全てを把握できる)ならば,問題ないと言えます.

投稿2019/09/23 02:01

fana

総合スコア11985

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

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

maisumakun

2019/09/23 02:08

環境設定のような「書き込む箇所はごく限定的で、参照されるのはあちこちから」というようなものは、グローバル変数としても弊害より利便性が勝りますね。
Zuishin

2019/09/23 02:20

設定なら、一つ一つの設定をグローバルにするのではなく、ファイルからの読み込みや書き込みなどのメソッドも持つ設定クラスをつくり、それをシングルトンにしたいですね。 同様に、本来なら各クラスに分けるべき情報を全てフラットにグローバル変数にし、C 言語ライクな手続き志向で作ってもいいのかという質問ではないかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問