2016-11-08 88 views
-1

我正在制作一台“自动售货机”,我需要索引总销售量以及机器中剩余的饮料量。现在,当用户点击苏打水的图片时,我会设置它,它会执行逻辑。以下是完整的类:结构和结构的对象在类中属于哪里?

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!"); 
      } 
     } 
    } 
} 

的主要问题是代码:

Drink Coke = new Drink(); 

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

当过用户点击图片,这些变量被重置。我需要在clicked方法之外初始化这些变量,但是当我尝试将它们移到此方法之外时,它会给出一个编译错误“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

在Class中创建一个公共Drink变量,这将使其可用于课堂以外的所有方法。如果你也使它成为静态的,这也会使其他类可用。你尝试过这样做吗? – vipersassassin

+3

你的直接问题是范围限定,但请注意,在这种情况下没有理由使用'struct',并且会导致比解决问题更多的问题。如果您将'Drink'从'struct'更改为'class',您将避免可变结构创建更多问题。 –

+0

如果您的老师告诉您为此使用二维数组,则他的犯罪行为是疯狂的。你应该仍然按照他的说法来完成这项任务,但是如果他邀请你检查他的集装箱,请记得礼貌地拒绝。 –

回答

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

这本书说我需要使用2d数组。 –

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中声明初始约束。这应该可以看到窗体和事件。我试图做到这一点,并没有从它的问题。