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

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

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

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

Q&A

解決済

4回答

793閲覧

For文内の値を参照する関数の途中結果を呼び出したい

hamusuke

総合スコア4

C++

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

0グッド

0クリップ

投稿2020/07/17 09:01

###状況
下記のようにLooP()内でWatch()を呼び出して、その後mainでWatch()で算出した値を呼び出そうとしています。下記では、spaceという変数を用意してi==5の時のWatch()の値を保存できるようにすることで、For文の中でのWatch()の途中結果を取得しています。
質問題名にあるような目的は一応達成できているのですが、spaceのような保存先をいちいち用意してあげることは効率が良くない気がします。
spaceを使わずに、for文の中でループする関数のループ途中の計算結果(例えばmainでi==5の時のhoge.Watch())を直接取得できるような方法はないでしょうか。

C++

1#include <iostream> 2class Hoge { 3public : 4 int i; 5 int space; 6 int Watch(); 7 void Loop(); 8}; 9 10int main() 11{ 12 Hoge hoge; 13 hoge.Loop(); 14 std::cout << "Answer is " << hoge.space << std::endl; 15 return 0; 16} 17 18int Hoge::Watch() { 19 return i + i; 20} 21 22void Hoge::Loop() { 23 for (i = 0; i <= 10; i++) { 24 if (i == 5) { 25 space = Watch(); 26 } 27 } 28}

###備考
windows10
visual studio2019

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

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

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

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

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

cateye

2020/07/17 09:53

置き場所がない物を、どうやって取るのでしょう?
hamusuke

2020/07/17 14:54

spaceのように保存のみを目的としたものを作るのではなく、WatchやLoop内で関連付けて保存場所を確保する方法がないか、ということをお聞きしました。 置き場所を全く用意しないで取得することが出来ないことは分かっております。分かりづらくて申し訳ありません。
guest

回答4

0

「iがいくつのときのWatch()の結果をどうするのか?」に関しては,Hogeの知るところではないように見えるので,
以下のように,具体的に何をすべきかは外側で決める(Hoge::IMonitorerForLoopの具体実装にまかせる)ようにしておけばどうでしょう.

↓の具体実装の例では,単に知らされてきた値をstd::coutに流すだけですが,
データを覚えておくような具体実装を用意する等,好きにすればよいです.

C++

1class Hoge 2{ 3public: 4 //Loop()に指定できる状況監視者のI/F 5 class IMonitorerForLoop 6 { 7 public: 8 virtual ~IMonitorerForLoop(){} 9 virtual void Monitor( int i, int ith_data ) = 0; 10 }; 11 12public : 13 int i; 14 //int space; //now, not needed 15 int Watch(); 16 void Loop( IMonitorerForLoop *pMonitorer=nullptr ); //引数は不要ならばnullptrでもよい 17}; 18 19int Hoge::Watch(){ return i + i; } 20 21void Hoge::Loop( IMonitorerForLoop *pMonitorer ) 22{ 23 for (i = 0; i <= 10; i++) 24 { 25 if( pMonitorer ){ pMonitorer->Monitor( i, Watch() ); } 26 } 27} 28 29//----------------- 30 31//単にstd::coutに情報を流すだけの具体実装例 32class OutputMonitorer : public Hoge::IMonitorerForLoop 33{ 34public: 35 virtual void Monitor( int i, int ith_data ) override 36 { std::cout << i << " : " << ith_data << std::endl; } 37}; 38 39int main() 40{ 41 Hoge hoge; 42 OutputMonitorer Monitorer; 43 hoge.Loop( &Monitorer ); 44 return 0; 45}

投稿2020/07/17 10:02

編集2020/07/17 10:05
fana

総合スコア11658

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

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

hamusuke

2020/07/17 15:22

ご回答ありがとうございます。示して頂いたプログラムを拝見いたしましたが、イメージとしては各ループの値をモニターによって観測してそれぞれ値を取得している感じでしょうか。 出力としては全ループにおけるそれぞれの算出値を出力していますが、mainで出力する際に、例えばループ6回目だけの算出値を表示する、ということはできるのでしょうか。質問では明記していませんでしたが、全ループそれぞれで算出した値を個別に呼び出したいと思っています。
fana

2020/07/17 15:50

OutputMonitorerは,ただの 簡単な一例 です. > データを覚えておくような具体実装を用意する等,好きにすればよい と回答内に書いています. mainが使うのに都合が良い実装を用意すれば良いだけです. 例えば【「全ループそれぞれで」渡されてきたデータの値を全て内部に蓄える & その情報を(後からmainが)引き出すための手段を備える】形の具体実装とすれば良いでしょう.
hamusuke

2020/07/17 16:44

分かりました、頂いたプログラムを基に自分の目的に合わせて実装していこうと思います。ありがとうございました!
guest

0

単にデバッグとして途中結果を見るだけならVisual Studioでブレークポイントを設定すれば特にソースの変更なく行なえます。

投稿2020/07/17 09:52

Kaleidoscope

総合スコア257

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

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

hamusuke

2020/07/17 15:13

ご回答ありがとうございます。単純に算出結果を得たいだけではなく、そのような処理を行えるようにしたいと思っています。
guest

0

ベストアンサー

呼び側で格納用の変数を用意しておいてそこに取得したいという話ですか?

C++

1#include <iostream> 2class Hoge { 3public: 4 int i; 5 int Watch(); 6 void Loop(int watchCount = 0, int* pValue = nullptr); 7}; 8 9int main() 10{ 11 Hoge hoge; 12 int value = 0; // 途中結果取得用変数 13 hoge.Loop(); // 途中結果がいらないとき 14 hoge.Loop(3, &value); // 途中結果がほしいとき 15 std::cout << "Answer is " << value << std::endl; 16 hoge.Loop(5, &value); // 途中結果がほしいとき 17 std::cout << "Answer is " << value << std::endl; 18 return 0; 19} 20 21int Hoge::Watch() { 22 return i + i; 23} 24 25void Hoge::Loop(int watchCount, int* pValue) { 26 for (i = 0; i <= 10; i++) { 27 if (i == watchCount && pValue) { 28 *pValue = Watch(); 29 } 30 } 31}

それともLoop()を呼んだ後から何とかして途中結果を取得する方法がないかという話でしょうか?
だとしたらどこかに結果を格納しておかない限りは無理です。

投稿2020/07/17 09:19

編集2020/07/17 09:23
SHOMI

総合スコア4079

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

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

hamusuke

2020/07/17 15:11

SHOMI様が示して頂いたプログラムを拝見いたしました。Loop()を呼んだ後だと確かに途中結果の取得はできず、最終結果を得ることしかできないと思います。 なるほど、このようにしてLoopに引数を持たせてあげると途中結果としての値を呼び出せるのですね。 SHOMI様が示されたプログラムでは、例えばExam Hoge::Watch()であり、Watch()の戻り値が単純な値ではなく、return Exam(〇,△)のような場合は,保存先*pvalueはどのように設定できるのでしょうか。 単純に*pvalueをExam(〇,△)と同じ型に設定してあげれば、同様に途中結果の値の参照が出来るのでしょうか。
SHOMI

2020/07/17 15:40

>単純に*pvalueをExam(〇,△)と同じ型に設定してあげれば、同様に途中結果の値の参照が出来るのでしょうか。 はい。
hamusuke

2020/07/19 08:28

SHOMI様の提示されたプログラムを基に問題を解決することが出来ました。ご回答いただきありがとうございました。
guest

0

spaceのような保存先をいちいち用意してあげることは効率が良くない気がします。

データを保存する以上は、何かしらの領域が必要かと思います。それに、組み込みでもない限り、int1つ分の領域など微々たるものです。

投稿2020/07/17 09:13

maisumakun

総合スコア145184

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

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

hamusuke

2020/07/17 14:55

何かしら保存先が必要であり、spaceを使いたくないなら何かほかの保存先を設定しなければならない、ということでしょうか。分かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問