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

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

詳細はこちら
C++

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

Q&A

解決済

2回答

671閲覧

静的メンバ関数で関数が実行された回数を数える

daiking

総合スコア19

C++

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

0グッド

0クリップ

投稿2019/12/17 04:13

編集2019/12/17 06:26

keisan.cpp

1using namespace std; 2 3int Counter::m_totalCount = 0; 4 5Counter::Counter() :m_count(0) { 6 7} 8void Counter::reset() { 9 m_count = 0; 10} 11void Counter::count() { 12 m_totalCount += m_count; 13 m_count++; 14 15 16 17} 18int Counter::getCount() { 19 return m_count; 20} 21int Counter::getTotalCount() { 22 23 return m_totalCount; 24}

keisan.h

1#pragma once 2#ifndef _KEISAN_H_ 3#define _KEISAN_H_ 4 5#include <iostream> 6 7 8class Counter 9{ 10public: 11 Counter(); 12 void reset(); 13 void count(); 14 int getCount(); 15 static int getTotalCount(); 16 17private: 18 int m_count; 19 static int m_totalCount; 20}; 21 22 23 24 25 26 27#endif // _KEISAN_H_

main.cpp

1#include <iostream> 2using namespace std; 3#include "keisan.h" 4int main() { 5 Counter c1, c2; 6 c1.count(); 7 c2.count(); 8 c2.count(); 9 c2.reset(); 10 c1.count(); 11 c1.count(); 12 c2.count(); 13 cout << "c1のカウント数" << c1.getCount() << endl; 14 cout << "c2のカウント数" << c2.getCount() << endl; 15 cout << "total count" << Counter::getTotalCount() << endl; 16 return 0; 17 18} 19コード
c1のカウント数3 c2のカウント数1 total count4

全体のコードはこのようになります。私が気になったのは結果のtotal countの表し方です。keisan.cppのところで静的メンバ変数である

m_totalcount=0;

として初期化をする。
そして

void Counter::count() { m_totalCount += m_count; m_count++; }

m_countをm_totalcountに代入することでインスタンスの数がわかるというのは理解できます。しかし、最初に私が行った処理は

void Counter::count() { m_totalCount = m_count; m_count++; }

でした。しかしこれではビルドはできたのですが結果が4ではなくなってしまいました。
どうしてm_totalCountは0なのにm_totalCount += m_count;でないと思った結果が出ないのでしょうか。
回答のほどよろしくお願いします。

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

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

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

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

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

jimbe

2019/12/17 04:54

C と C++ は別モノです. C++ でのご質問でしたら, C のタグは外して頂けますか.
jimbe

2019/12/17 05:04

c1.count(); をもう一行増やしてみると, 現状でも変なことに気が付くかと思います.
guest

回答2

0

静的メンバ関数でインスタンス数を数えたい

タイトルからコンストラクタでm_totalCountを+1、デストラクタでm_totalCountを-1をするのが普通だと思います。

c++

1Counter::Counter() :m_count(0) { 2 m_count = m_totalCount; 3 m_totalCount++; 4} 5Counter::~Counter(){ 6 m_totalCount--; 7}

投稿2019/12/17 05:22

stdio

総合スコア3307

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

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

stdio

2019/12/17 07:59

サイトを拝見しましたが、これはサイトの書き方が悪いですね。 初心者に対する引掛けが多い気がします... とりあえず、解決出来て良かったですね。 これからも勉強頑張って下さい。
daiking

2019/12/17 08:21

そうなんですね。 ありがとうございました!
guest

0

ベストアンサー

どうしてm_totalCountは0なのにm_totalCount += m_count;でないと思った結果が出ないのでしょうか。

とのことですが、m_totalCount += m_count; も間違っています。
偶然今の main 関数の場合正しい出力になっているというだけで、少し変えると間違った出力になります。

また、最初に行ったという、

c++

1void Counter::count() { 2 m_totalCount = m_count; 3 m_count++; 4}

の処理も間違っています。
なぜこれでうまくいくと思ったのかわかりません。

全然勉強にならないだろうし、作業依頼に近いので、答えは書かかないことにします。
void Counter::reset()void Counter::count() のコードを一から考え直してみてください。

投稿2019/12/17 04:58

2KOH

総合スコア999

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

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

daiking

2019/12/17 05:32

本当ですね。たまたまうまくいっただけでした。 あと、自分の質問がとても変だったので訂正させていただきます。 cout << "トータルのカウント数:" << c1.getCount() + c2.getCount() << endl; この処理を静的メンバ変数を使って書き直したいと思っております。 自分の考えではcountに入っている数をm_totalCountに入れてあげればよろしくいと考えているのですがこの考えは間違っていないでしょうか? しかし、静的メンバ関数内ではインスタンスメンバ変数は使えないので苦戦しています。
2KOH

2019/12/17 05:48

実装方法はいくつかあります。 countに入っている数をm_totalCountに入れるというような考え方は、今回のケースでは面倒なやり方です。 インスタンスで count() が実行されると、インスタンスのカウントがプラス1され、同時にトータルのカウントも同じ数だけプラスされますよね。 また、インスタンスで reset() が実行されると、インスタンスのカウントがゼロになり(つまり、reset() が呼び出された時点でのインスタンスのカウントの数だけマイナスされ)、同時にトータルのカウントも同じ数だけマイナスされますよね。 たぶん、これをコードにするやり方が最も楽なやり方です。
daiking

2019/12/17 06:18

丁寧にありがとうございます。 自分がよさそうだなと思った実装は ①メンバ変数 m_count2を用意する ②count関数でm_totalCount++ ,m_count++,m_count2++とする ③resetでm_totalCount-=m_count2としてresetされたぶんだけm_totalCountから削除する という風な実装で一応正常には動きました。この実装の考え方はどう思いますか?
Mithra

2019/12/17 06:26

自分の書いたコードを実行した場合に、main()の中を1行実行したら、クラスのメンバ変数がどう変化するか、紙にでも書いて考えてみてください。自分の考えた方法は間違っていないはずという思い込みがある為に何が間違っているのかが分からないのだと思います。
2KOH

2019/12/17 06:26

m_count と m_count2 の違いは何ですか? m_count2 を用意する意味は全くないと思うのですが。
Mithra

2019/12/17 06:30

m_count2は無くても実装できると思います。
daiking

2019/12/17 07:01

お二方アドバイスありがとうございました。実装はできたもの自分の書いたコードが理解できていないので今一度基礎からやり直したいと思います。 また、質問が変わるのですが瞬時に他人のコードを見てこうしたほうがいいのでは?という風に考えられるのはやはり経験のなかでこのような実装をしてその経験値をいかしているということなのでしょうか。というのも、問題をみてもどうやって実装していいかさっぱりわからないのです。これは経験を積んでいくしかないのでしょうか。 ながながとすみません。
Mithra

2019/12/18 03:19

経験もあると思いますし、論理的な思考(今回の件ではそこまで大げさなものでもないと思いますが)が出来るか?という事もあると思います。 Counter::count()についていえば、m_countでインスタンス毎の値を管理しているのですから、m_totalCountの増減の量はm_countのそれと同じでなければならないはずです。 なので、++m_countしたら++m_totalCount。 Counter::reset()については、m_count=0つまり-m_countしているので、m_totalCount -= m_countです。 頭の中だけで問題が整理できないのであれば、エディターなり紙なりでどう値が変化するのが正しいかを書いてみるなり、デバッグ実行して変数の値を確認してみるなり、地道な確認を行ってみてください。 比較的単純なコードで自分が思った通りに動かないのは問題を十分に理解してない状態でコーディングしているからです(理解するまでコードを書くなという意味ではありません)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問