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

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

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

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

Q&A

解決済

2回答

2404閲覧

現在のコードを staticメンバ関数によって出力できるようにしたいです。

xss

総合スコア36

C++

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

0グッド

0クリップ

投稿2019/03/27 14:27

編集2019/03/27 14:59

前提・実現したいこと

下記の条件を含めて、c1.getCount() + c2.getCount()をクラスCounterの静的メソッドによって出力できるようにしたいです。

よろしければコードを教えて頂けませんでしょうか。
お手数おかけ致しますがお力添えをよろしくお願いいたします。

●条件
1.作成する静的メンバ関数の名前は、getTotalCount()とする。(戻り値はint)
2.この関数内では、トータルのカウント回数を記録した静的メンバ変数を、m_totalCountとする。

該当のソースコード

●main.cpp

#include <iostream> #include "counter.h" using namespace std; 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; //下記の文、c1.getCount() + c2.getCount()を staticメンバ関数( getTotalCount() )によって出力できるようにしたい。 cout << "トータルのカウント数:" << c1.getCount() + c2.getCount() << endl; return 0; }

●counter.h

#ifndef _COUNTER_H_ #define _COUNTER_H_ class Counter{ private: // 回数 int m_count; public: // コンストラクタ Counter(); // リセット void reset(); // カウント void count(); // カウントの数 int getCount(); }; #endif // _COUNTER_H_

●counter.cpp

#include "counter.h" // コンストラクタ(カウント回数を0で初期化) Counter::Counter() : m_count(0) { } void Counter::reset(){ m_count = 0; } void Counter::count(){ m_count++; } int Counter::getCount(){ return m_count; }

実行結果
c1のカウント数:3
c2のカウント数:1
トータルのカウント数:4

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

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

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

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

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

tiitoi

2019/03/27 14:37

> 静的メソッドによって出力できるようにしたい すみませんが、やりたいことがいまいちよくわからないです。 静的メソッドとは static メンバ関数のことだと理解していますが、それであっていますか? 以下の引数の型 getCount とはなんなのでしょうか? Counter::getTotalCount(getCount a, getCount b)
xss

2019/03/27 14:41

tiitoiさんコメントありがとうございます。 >静的メソッドとは static メンバ関数のことだと理解していますが、それであっていますか? 仰るとおりです。 >以下の引数の型 getCount とはなんなのでしょうか? >Counter::getTotalCount(getCount a, getCount b) 自分で試したコードのごみが残っていました。 申し訳ございません。 削除して訂正いたしました。
tiitoi

2019/03/27 14:42

operator+() をオーバーロードしたいということでしょうか?
xss

2019/03/27 14:54

申し訳ございません。operator+()という手法を始めて拝見いたしました。 目的としてはmain.cpp の cout << "トータルのカウント数:" << c1.getCount() + c2.getCount() << endl;の c1.getCount() + c2.getCount()を、クラスCounterのstaticメンバ関数によって出力できるようにプログラムを改造したいです。
guest

回答2

0

途中でデストラクトされることを考慮した版

C++

1#include <set> 2#include <algorithm> 3#include <iostream> 4 5class Counter{ 6private: 7 // 回数 8 int m_count; 9 static std::set<Counter*> instances; 10public: 11 // コンストラクタ 12 Counter() { reset(); instances.insert(this); } 13 ~Counter() { instances.erase(this); } 14 // リセット 15 void reset() { m_count = 0; } 16 // カウント 17 void count() { ++m_count; } 18 // カウントの数 19 int getCount() const { return m_count; } 20 21 // 総カウント数 22 static int getTotalCount() { int total = 0; 23 for ( const Counter* c : instances ) { total += c->getCount(); } 24 return total; 25 } 26}; 27 28std::set<Counter*> Counter::instances; 29 30int main() { 31 using namespace std; 32 33 Counter c0, c1; 34 c0.count(); 35 c1.count(); 36 { 37 Counter c2; 38 c2.count(); 39 c2.count(); 40 cout << "c0+c1+c2 = " << Counter::getTotalCount() << std::endl; 41 } 42 cout << "c0+c1 = " << Counter::getTotalCount() << std::endl; 43}

投稿2019/03/27 21:04

episteme

総合スコア16614

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

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

0

ベストアンサー

以下の意図であっていますでしょうか?

cpp

1class Counter 2{ 3 private: 4 int m_count; 5 6 static int m_totalCount; 7 8 public: 9 Counter(); 10 void reset(); 11 void count(); 12 int getCount(); 13 static int getTotalCount(); 14}; 15

cpp

1// 静的メンバ変数の定義が必要 2int Counter::m_totalCount = 0; 3 4Counter::Counter() : m_count(0) 5{ 6} 7 8void Counter::reset() 9{ 10 m_totalCount -= m_count; 11 m_count = 0; 12} 13 14void Counter::count() 15{ 16 m_totalCount++; 17 m_count++; 18} 19 20int Counter::getCount() 21{ 22 return m_count; 23} 24 25int Counter::getTotalCount() 26{ 27 return m_totalCount; 28}

cpp

1int main() 2{ 3 Counter c1, c2; 4 c1.count(); 5 c2.count(); 6 c2.count(); 7 c2.reset(); 8 c1.count(); 9 c1.count(); 10 c2.count(); 11 12 std::cout << "c1: " << c1.getCount() << std::endl; 13 std::cout << "c2: " << c2.getCount() << std::endl; 14 std::cout << "total: " << Counter::getTotalCount() << std::endl; 15 16 return 0; 17}
c1: 3 c2: 1 total: 4

投稿2019/03/27 14:58

tiitoi

総合スコア21956

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

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

xss

2019/03/28 15:24

tiitoiさん回答ありがとうございます。 とても勉強になりました。 感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問