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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

8710閲覧

静的プロパティに関する問題で困ってます。

57svu

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/05/15 05:31

とあるサイトに掲載されている静的プロパティに関する問題です

c#

1namespace Problemex2_4 2{ 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Counter c1,c2; 8 c1 = new Counter(); 9 c2 = new Counter(); 10 c1.Increment(); 11 c2.Increment(); 12 c2.Increment(); 13 c2.Reset(); 14 c1.Increment(); 15 c1.Increment(); 16 c2.Increment(); 17 Console.WriteLine("c1のカウント数:" + c1.Count); 18 Console.WriteLine("c2のカウント数:" + c2.Count); 19 Console.WriteLine("トータルのカウント数:" + (c1.Count + c2.Count)); 20 } 21 } 22} 23``````c# 241 252 263 274 285 296 307 318 329 3310 3411 3512 3613 3714 3815 3916 4017 4118 4219 4320 4421 4522 4623 4724 4825 4926 5027 5128 5229 5330 5431 5532 56using System; 57using System.Collections.Generic; 58using System.Linq; 59using System.Text; 60using System.Threading.Tasks; 61 62

実行結果 ↓

c1のカウント数:3
c2のカウント数:1
トータルのカウント数:4

問題内容

Program.csの25行目に出ている、c1.Count + c2.Countを、クラスCounterの静的プロパティによって出力できるようにプログラムを改造しなさい。その際、以下のようにクラスCounterを変更すること。

Counterクラスの変更ポイント
作成する静的プロパティの名前は、TotalCountとする。(戻り値はint)
このメソッド内では、トータルのカウント回数を記録した静的フィールドを、totalCountとする。

自分の回答 ↓

c#

1namespace Ploblemx2_4 2{ 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 8 /* c1のカウント数:3 9 10 * c2のカウント数:1 11 12 * トータルのカウント数:4 13 14 ↑ 期待される実行結果 15 */ 16 17 Counter c1, c2; 18 c1 = new Counter(); // Counterクラスのc1.c2のインスタンス生成 19 c2 = new Counter(); 20 c1.Increment(); // c1クラスでメソッドIncrementを呼出し 21 c2.Increment(); // c2クラスでメソッドIncrementを呼出し 22 c2.Increment(); // c2クラスでメソッドIncrementを呼出し 23 c2.Reset(); // c2クラスのでメソッドResetを呼出し→c2クラスのCountは0に 24 c1.Increment(); // c1クラスでメソッドIncremrntを2回呼出し 25 c1.Increment(); 26 c2.Increment(); // c2クラスでメソッドIncrementを呼出し 27 Console.WriteLine(" c1のカウント数 : " + c1.Count); 28 Console.WriteLine(" c2のカウント数 : " + c2.Count); 29 // 静的プロパティによって出力可能な状態に変換 ↓ 30 // 呼び出す際は先頭にクラス名 . 静的プロパティ 31 Console.WriteLine("トータルのカウント数: " + Counter.TotalCount); 32 33 //Console.WriteLine("トータルのカウント数: " + (c1.Count + c2.Count)); 34 System.Threading.Thread.Sleep(10000); 35 } 36 } 37} 38

c#

1namespace Ploblemx2_4 2{ 3 class Counter 4 { 5 6 /* 7 * Counterクラスの変更ポイント 8 * 作成する静的プロパティの名前は、TotalCountとする。(戻り値はint) 9 * このメソッド内では、トータルのカウント回数を記録した静的フィールドを、totalCountとする。 10 */ 11 12 // カウント 13 private static int count = 0; 14 15 // 静的フィールド : トータルのカウント回数の記録用 16 private static int totalCount = count += count ; 17 18 // コンストラクタ 19 public void Reset() 20 { 21 count = 0; 22 } 23 // カウントのインクリメント 24 public void Increment() 25 { 26 count++; 27 } 28 // 回数のプロパティ 29 public int Count 30 { 31 get // private int count を返すインスタンスプロパティ 32 { 33 return count; 34 } 35 } 36 /* c1.Count + c2.Countの様に 37 * 計算結果を保持する静的フィールド用の静的プロパティ 38 */ 39 public static int TotalCount 40 { 41 get 42 { 43 return totalCount; 44 } 45 } 46 } 47} 48

デバッグ実行して気付いたこと

1、すべてのメソッドにおいてc1.c2が分けてメソッド実行されていない
2、静的メンバーのトータルカウントが機能していない

問題分に記載されている様式に戻すことできづいたこと

1、クラスの冒頭に
private int count = 0を
private static int count = 0
とし
変更されたcountのプロパティをstatic化していないために
count が共通化された?

そこでプロパティにstaticをつけたところ今度は
Program.csの最後のConsole.WriteLineでのc1、c2クラスでの呼出しがエラー表示された。

なぜなのかがわかりません。
助言を宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

変更されたcountのプロパティをstatic化していないために

count が共通化された?

countstatic化しているから共通になっています。

staticフィールド:そのクラス自体が持つ変数。クラス名.フィールド名
普通のフィールド:インスタンスごとに個別に持つ変数。インスタンス名.フィールド名

投稿2017/05/15 05:43

編集2017/05/15 06:04
ozwk

総合スコア13521

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

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

57svu

2017/05/15 06:34

素早いご指摘ありがとうございます! そこを改善し、private static int totalCount = 0; とし 各メソッド インクリメントの際に トータルの方も++; リセットの際も トータルの方も=0; と付加したのですが この場合だと totalCountが0のときにどっちも0 にリセットされてしまいます そこでtotalCountを2つ作ったて最後にたせばいいのかと考えたのですが それだと静的にする意義がなくなってしまいます 一体どう考えればいいのでしょうか
ozwk

2017/05/15 06:39

リセットのときは=0じゃなくてリセットするインスタンスのcount引けばいいですよねそれ
57svu

2017/05/15 07:00

count -= count; totalCout -= count; ということでしょうか するとトータルが6になりました
ozwk

2017/05/15 07:08 編集

いや例えば、トータル9のときに、4のカウンタをリセットしたら トータル5になるようにしたいんですよね? これをあなたはどう計算しました? それを実装してみてください。
57svu

2017/05/15 07:14

もやもやが溶けました ありがとうございます! 図にかいてみて 自分が行いたい作業の順番と 実際に行っている作業の順番がいがうとこに気がつけました! 先ほどのメソッドの順番を逆にしたら上手くいきました! 丁寧なコメントをありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問