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

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

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

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

Q&A

解決済

2回答

1592閲覧

静的メンバを使ったトータルカウント数の求め方

sattsun

総合スコア25

C++

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

0グッド

0クリップ

投稿2020/02/28 13:48

c1のカウント数とc2のカウント数を足したものをトータルのカウント数で出力したいのですが、c2のカウント数が出力されます。足し方が分かりません。トータルのカウント数:4になってほしいです。
現状で以下のように出力されます。
m_count:1
m_totalCount:1
m_count:1
m_totalCount:1
m_count:2
m_totalCount:2
reset count:0
m_count:2
m_totalCount:2
m_count:3
m_totalCount:3
m_count:1
m_totalCount:1
c1のカウント数:3
c2のカウント数:1
トータルのカウント数:1

#include <iostream>
using namespace std;
class Counter {
private:
// 回数
int m_count;
static int m_totalCount;
public:
// コンストラクタ
Counter();
// リセット
void reset();
// カウント
void count();
// カウントの数
int getCount();

static int getTotalCount();

};

int Counter::m_totalCount = 0;

// コンストラクタ(カウント回数を0で初期化)
Counter::Counter() : m_count(0)
{

}
void Counter::reset() {

m_count = 0; cout << "reset count:" << m_count << endl;

}
void Counter::count() {

m_count++; m_totalCount = m_count; cout << "m_count:" << m_count << endl; cout << "m_totalCount:" << m_totalCount << endl;

}
int Counter::getCount() {

return m_count;

}
int Counter::getTotalCount() {

return m_totalCount ;

}
int main() {
Counter c1, c2;
c1.count();
c2.count();
c2.count();
c2.reset();
c1.count();
c1.count();
c2.count();
cout << "c1のカウント数:" << c1.getCount() << endl;
cout << "c2のカウント数:" << c2.getCount() << endl;

//Counter::getTotalCount() = c1.getCount() + c2.getCount(); cout << "トータルのカウント数:" << Counter::getTotalCount() << endl; return 0;

}

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

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

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

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

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

guest

回答2

0

別解をこしらえてみた

C++

1#include <iostream> 2#include <set> 3 4using namespace std; 5 6class Counter { 7private: 8 // 回数 9 int m_count; 10 11 // この世に存在する全Counter 12 static std::set<const Counter*> counters; 13 14public: 15 Counter(); 16 ~Counter(); 17 void reset(); 18 void count(); 19 int getCount() const; 20 static int getTotalCount(); 21}; 22 23std::set<const Counter*> Counter::counters; 24 25Counter::Counter() : m_count(0) { 26 // Counter誕生 27 counters.insert(this); 28} 29 30Counter::~Counter() { 31 // Counter死去 32 counters.erase(this); 33} 34 35void Counter::reset() { m_count = 0; } 36void Counter::count() { m_count++; } 37int Counter::getCount() const { return m_count; } 38 39int Counter::getTotalCount() { 40 // この世の全Counterのカウントを集計する 41 int result = 0; 42 for ( const Counter* ctr : counters ) { 43 result += ctr->getCount(); 44 } 45 return result; 46} 47 48int main() { 49 Counter c1; 50 c1.count(); 51 { 52 Counter c2; 53 c2.count(); 54 c2.count(); 55 c2.reset(); 56 c1.count(); 57 c1.count(); 58 c2.count(); 59 cout << "c1のカウント数:" << c1.getCount() << endl; 60 cout << "c2のカウント数:" << c2.getCount() << endl; 61 cout << "トータルのカウント数:" << Counter::getTotalCount() << endl; 62 } 63 cout << "c1のカウント数:" << c1.getCount() << endl; 64 cout << "トータルのカウント数:" << Counter::getTotalCount() << endl; 65}

投稿2020/02/29 00:02

episteme

総合スコア16614

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

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

0

ベストアンサー

staticなクラス変数は、すべてのインスタンスに共通で一つしかありません。現状のコードだと、最後にcount()呼び出したインスタンスのカウント数でm_totalCountを上書きしてしまっています。おそらく、やりたいのはこんな感じのことでしょうか。

C++

1void Counter::reset() { 2 3 m_totalCount -= m_count; // ここを追加 4 m_count = 0; 5 6 cout << "reset count:" << m_count << endl; 7} 8 9void Counter::count() { 10 11 m_count++; 12 m_totalCount++; // ここを変更 13 14 cout << "m_count:" << m_count << endl; 15 cout << "m_totalCount:" << m_totalCount << endl; 16 17}

投稿2020/02/28 14:53

Bearded-Ockham

総合スコア430

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

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

sattsun

2020/03/01 06:49

実行できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問