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

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

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

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

Q&A

解決済

2回答

1991閲覧

ofstreamオブジェクトをグローバル変数として扱いたい

mmtaro000

総合スコア15

C++

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

0グッド

0クリップ

投稿2021/10/21 07:47

ofstreamのオブジェクトを複数の関数で共有して扱いたいのですが、どうすれば良いでしょうか。イメージとしては以下のとおりです。

C++

1void hoge(void){ 2 for (int i = 0; i < 5; i++){ 3 fstream ofs("test" + to_string(i) + ".txt"); 4 hoge1(); 5 hoge2(); 6 hoge3(); 7 ofs << endl; 8 } 9} 10 11void hoge1(void){ 12 ofs << 1 << " "; 13} 14void hoge2(void){ 15 ofs << 2 << " "; 16} 17void hoge3(void){ 18 ofs << 3 << " "; 19}

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

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

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

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

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

guest

回答2

0

ベストアンサー

ofstreamオブジェクトをグローバル変数として扱いたい

というならば,単にグローバル変数にすれば良いのではないでしょうか?

C++

1//グローバル変数 2std::ofstream ofs; 3 4void hoge(void){ 5 for (int i = 0; i < 5; i++){ 6 ofs = ofstream("test" + to_string(i) + ".txt"); 7 hoge1(); 8 hoge2(); 9 hoge3(); 10 ofs << endl; 11 } 12}

ただし,目的に関して言えば,単純にこんなの↓で事足りる気がします.

C++

1void hoge1( std::ostream &OS ){ 2 OS << 1 << " "; 3}

投稿2021/10/21 08:14

編集2021/10/21 08:21
fana

総合スコア11996

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

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

mmtaro000

2021/10/21 08:27

ありがとうございます。助かりました。
guest

0

グローバル変数を使うのではなく、引数戻り値を利用しましょう。

「C言語 関数」とかで調べてください。

グローバル変数でも確かに実装自体はできます。ですがバグの温床になりやすいです。

自分ひとりでやるならいいですが、普通、会社レベルになるとチーム開発になります。
で、仮に簡単なプログラムとして、「入力値をテストの点数として仮定し、80点以上なら合格、それ未満なら不合格と表示するプログラム」を作るとします。

そして、グローバル変数 point (= 点数) を用意したとして、これにアクセスする場合、
グローバル変数はどこからでもアクセスが可能です。

よって、想定しない場所でデータの書き換えが行われる可能性があります。
確かに引数や戻り値も書き換え可能ですが、デバッグ時にはデータの状態や設定・取得している範囲を見ればいいだけです。

でも、グローバル変数だと、関係のない関数からでも触る事ができますから、「全ての範囲」を対象に調査しないといけません。

1人で作るなら勝手にすればいいのですが、1人で作る場合でも一か月前の自分が作ったものをマジで忘れているってこともザラです。(読めばわかるが、細かい部分までは...)

プログラミングは書いて終わり…ではありません。デバッグや保守も必要です。

後の事を考えると、やはりグローバル変数は使うのはやめておいた方がいいです。

ただし、Windows APIとかで複数のウィンドウプロシージャ(他の言語やライブラリだとイベントに相当するものを処理するやつ) で使い回す場合とか、競技プログラミングとかであえて使うってことはあります。

ですが、安易にグローバル変数を使うとバグの温床になり、修正困難に陥る可能性もありますから、使わない方が無難です。

なので、引数や戻り値によって対処しましょう。

書き方は調べてください。入門書とかにも載っていることです。

投稿2021/10/21 08:10

BeatStar

総合スコア4962

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

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

mmtaro000

2021/10/21 08:13

「グローバル変数でも確かに実装自体はできます。ですがバグの温床になりやすいです。」 では実装方法を教えていただけますか? 仮にバグが起こったとしてもこちらの責任ですので、気兼ねなく教えていただければ幸いです。
dodox86

2021/10/21 08:15

> グローバル変数でも確かに実装自体はできます。ですがバグの温床になりやすいです。 低評価をしたのは私ではありませんが、そこを押しての技術的な質問なのだと思います。例えば、std::coutのような使い方をしたいのかと。
dodox86

2021/10/21 08:19

例えばログ出力のような、アプリケーション全般にわたる横断的な処理ではそのような使い方が決して無いこともないです。
fana

2021/10/21 08:23 編集

グローバル変数にする実装を私の回答の方に追記しました. (単に,ローカルじゃない場所に定義すればいいだけっすよね?)
mmtaro000

2021/10/21 08:28

すみません、解決しました。皆様解答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問