2016-11-08 48 views
-1

私は "自動販売機"を作っています。私は総売上とマシンに残っている飲み物の量を索引付けする必要があります。今私はそれがユーザーがソーダの画像をクリックすると設定されて、それはロジックを行います。ここでは完全なクラスがある:ユーザーが画像をクリックして、これまで構造体の構造体とオブジェクトは、クラス内でどこに属していますか?

Drink Coke = new Drink(); 

Coke.Name = (string)Cola[0, 0]; 
Coke.Price = (float)Cola[0, 1]; 
Coke.Amount = (int)Cola[0, 2]; 

、これらの変数がリセットされた場合:

namespace _8_11 
{ 

    struct Drink 
    { 
     public string Name; 
     public float Price; 
     public int Amount; 
    } 

    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     object[,] Cola = new object[,] 
     { 
      {"Coke", 1.00f, 20 }, 
      {"Beer", 1.00f, 20 }, 
      {"Sprite",1.00f, 20 }, 
      {"Grape", 1.50f, 20 }, 
      {"Cream", 1.50f, 20 } 
     }; 

     float total = 0.00f; 

     private void pictureBox1_Click(object sender, EventArgs e) 
     { 
      Drink Coke = new Drink(); 

      Coke.Name = (string)Cola[0, 0]; 
      Coke.Price = (float)Cola[0, 1]; 
      Coke.Amount = (int)Cola[0, 2]; 

      if (Coke.Amount > 1 && Coke.Amount <= 20) 
      { 
       Coke.Amount -= 1; 
       total += Coke.Price; 
       cokeLeftLabel.Text = Coke.Amount.ToString(); 
       totalSalesLabel.Text = total.ToString("c"); 
      } 
      else { 
      MessageBox.Show("We are out of Coke!"); 
      } 
     } 
    } 
} 

主な問題は、コードがあることです。私はクリックされたメソッドの外でこれらの変数を初期化する必要がありますが、このメソッドの外側に移動しようとするとコンパイルエラー "Coke.Amountがこの現在のコンテキストに存在しません"が返されます。

私はそれを修正しました。ここで改訂されたコードは次のとおりです。

if (Coke.Amount > 0 && Coke.Amount <= 20) 
     { 
      Coke.Amount -= 1; 
      Cola[0, 2] = Coke.Amount; 
      total += Coke.Price; 
      cokeLeftLabel.Text = Coke.Amount.ToString(); 
      totalSalesLabel.Text = total.ToString("c"); 
     } 
+0

クラス内に公開Drink変数を作成すると、クラス内のすべてのメソッドで利用できるようになります。静的にすると、他のクラスでも使用できるようになります。これをやろうとしましたか? – vipersassassin

+3

あなたの直ぐの問題はスコープですが、この場合には 'struct'を使う理由はなく、解決するよりも多くの問題が生じます。 'struct'から' class'に 'Drink'を変更すると、可変構造体が作る多くの問題を避けることができます。 –

+0

先生が2次元配列を使用するように言ったら、彼は犯罪者としては狂ってしまいます。彼が言うように譲渡を行うべきですが、船積み用のコンテナを点検するように頼んだら丁寧に辞めることを忘れないでください。 –

答えて

1

あなたはこのような何かを試みることができる:

List<Drink> drinks = new List<Drink> 
{ 
    new Drink("Cola", 1.5f 20), 
    //... 
} 

private void pictureBox1_Click(object sender, EventArgs e) 
{ 
    Drink drink = drinks[0];//Get the correct drink 
    drink.Amount--; 
    //...  
+0

本では2次元配列を使う必要があると書かれています。 –

1

私は通常の宣言を引っ張ってみ

public class DrinkPictureBox : PictureBox 
{ 
    Drink drink = new Drink(); 

    public DrinkPictureBox(string Name, float Price, int Amount) 
    { 
     drink.Name = Name; 
     drink.Price = Price; 
     drink.Amount = Amount; 
    } 
} 
1

次のコードのようなカスタムピクチャボックスを作成しますクラスへの変数

public partial class Form1 : Form 
    { 
     internal Drink Coke = new Drink(); 
     public Form1() 
     { 
      InitializeComponent(); 
      Coke.Name = (string)Cola[0, 0]; 
      Coke.Price = (float)Cola[0, 1]; 
      Coke.Amount = (int)Cola[0, 2]; 
     } 
    } 

次に、Form1中に初期制約を宣言します。これにより、フォームとイベントの両方が可視になります。私はこれをやろうとしましたが、問題はありませんでした。

関連する問題