1

I get the following error when compiling:

CS0120: An object reference is required for the non-static field, method or property 'QuickSharp.CokeMachine.TotalInsertedCoins'

This is because I'm trying to use the TotalInsertedCoins variable from another class (CokeForm). How can I fix this? If I want to add the buttons in my CokeForm method, I'm getting the same issue.

My code:

using System;
using System.Windows.Forms;
using System.Drawing;

namespace QuickSharp
{
    public class CokeMachine
    {
        Button Coke;
        Button Sprite;
        Button Fanta;
        Button RedBull;
        Button Juice;
        Button Water;

        double CokeCost = 1.00;
        double SpriteCost = 1.00;
        double FantaCost = 1.00;
        double RedBullCost = 2.50;
        double JuiceCost = 2.00;
        double WaterCost = 0.50;

        Button Coin1;
        Button Coin2;
        Button Coin3;
        Button Coin4;
        Button Coin5;
        Button Coin6;

        double CoinAmount1 = 0.05;
        double CoinAmount2 = 0.10;
        double CoinAmount3 = 0.20;
        double CoinAmount4 = 0.50;
        double CoinAmount5 = 1.00;
        double CoinAmount6 = 2.00;

        public double TotalInsertedCoins = 0;

        //EventHandlers for drink buttons

        public void DrinkButtonsEvents()
        {
            Coke.Click += new EventHandler(Coke_ClickHandler);
            Sprite.Click += new EventHandler(Sprite_ClickHandler);
            Fanta.Click += new EventHandler(Fanta_ClickHandler);
            RedBull.Click += new EventHandler(RedBull_ClickHandler);
            Juice.Click += new EventHandler(Juice_ClickHandler);
            Water.Click += new EventHandler(Water_ClickHandler);
        }

        //Drink buttons - Click event handlers

        public void Coke_ClickHandler(object sender, EventArgs e)
        {
            if(TotalInsertedCoins >= CokeCost)
            {
                DispenseDrink("Coca-Cola", CokeCost);
            }
            else
            {
                MessageBox.Show("You have not inserted enough money to buy this drink.", "Warning");
            }
        }

        public void Sprite_ClickHandler(object sender, EventArgs e)
        {
            if(TotalInsertedCoins >= SpriteCost)
            {
                DispenseDrink("Sprite", SpriteCost);
            }
            else
            {
                MessageBox.Show("You have not inserted enough money to buy this drink.", "Warning");
            }
        }

        public void Fanta_ClickHandler(object sender, EventArgs e)
        {
            if(TotalInsertedCoins >= FantaCost)
            {
                DispenseDrink("Fanta", FantaCost);
            }
            else
            {
                MessageBox.Show("You have not inserted enough money to buy this drink.", "Warning");
            }
        }

        public void RedBull_ClickHandler(object sender, EventArgs e)
        {
            if(TotalInsertedCoins >= RedBullCost)
            {
                DispenseDrink("Red Bull", RedBullCost);
            }
            else
            {
                MessageBox.Show("You have not inserted enough money to buy this drink.", "Warning");
            }
        }

        public void Juice_ClickHandler(object sender, EventArgs e)
        {
            if(TotalInsertedCoins >= JuiceCost)
            {
                DispenseDrink("Orange Juice", JuiceCost);
            }
            else
            {
                MessageBox.Show("You have not inserted enough money to buy this drink.", "Warning");
            }
        }

        public void Water_ClickHandler(object sender, EventArgs e)
        {
            if(TotalInsertedCoins >= WaterCost)
            {
                DispenseDrink("Water", WaterCost);
            }
            else
            {
                MessageBox.Show("You have not inserted enough money to buy this drink.", "Warning");
            }
        }

        //EventHandlers for money buttons

        public void MoneyButtonEvents()
        {
            Coin1.Click += new EventHandler(Coin1_ClickHandler);
            Coin2.Click += new EventHandler(Coin2_ClickHandler);
            Coin3.Click += new EventHandler(Coin3_ClickHandler);
            Coin4.Click += new EventHandler(Coin4_ClickHandler);
            Coin5.Click += new EventHandler(Coin5_ClickHandler);
            Coin6.Click += new EventHandler(Coin6_ClickHandler);
        }

        //Money buttons - Click event handlers

        public void Coin1_ClickHandler(object sender, EventArgs e)
        {
            TotalInsertedCoins += CoinAmount1;
        }

        public void Coin2_ClickHandler(object sender, EventArgs e)
        {
            TotalInsertedCoins += CoinAmount2;
        }

        public void Coin3_ClickHandler(object sender, EventArgs e)
        {
            TotalInsertedCoins += CoinAmount3;
        }

        public void Coin4_ClickHandler(object sender, EventArgs e)
        {
            TotalInsertedCoins += CoinAmount4;
        }

        public void Coin5_ClickHandler(object sender, EventArgs e)
        {
            TotalInsertedCoins += CoinAmount5;
        }

        public void Coin6_ClickHandler(object sender, EventArgs e)
        {
            TotalInsertedCoins += CoinAmount6;
        }

        private void DispenseDrink(string drink , double cost)
        {
            if(TotalInsertedCoins - cost == 0.0)
            {
                MessageBox.Show("Enjoy your " + drink + "!");
                TotalInsertedCoins = 0.0;
            }
            else
            {
                MessageBox.Show("Enjoy your " + drink + "! Here is your change: €" + (TotalInsertedCoins - cost));
                TotalInsertedCoins = 0.0;
            }
        }
    }

    public class CokeForm : Form
    {
       public CokeForm()
       {
            // General aspect of machine

            this.Text = "Cola Machine";
            this.Size = new Size(450, 500);

            Label Header;
            Header = new Label();
            Header.Text = "Coca-Cola Machine";
            Header.Font = new Font("Arial", Header.Font.Size + 5);
            Header.ForeColor = Color.DarkRed;
            Header.Location = new Point(132, 20);
            Header.AutoSize = true;
            this.Controls.Add(Header);

            TextBox TextBox1 ;
            TextBox1 = new TextBox();
            TextBox1.BackColor = Color.Black;
            TextBox1.ForeColor = Color.Red;
            TextBox1.Font = new Font("Arial", TextBox1.Font.Size + 3);
            TextBox1.ReadOnly = true;
            TextBox1.Size = new Size(210, 300);
            TextBox1.Location = new Point(112, 50);

            //TextBox1.SelectionStart = TextBox1.Text.Length;
            //TextBox1.ScrollToCaret();
            //TextBox1.Refresh();


            if(CokeMachine.TotalInsertedCoins == 0.00)
            {
                TextBox1.Text = "Buy Your Ice Cold Drinks Here!";
            }
            else
            {
                TextBox1.Text = "Inserted Coins: €" + CokeMachine.TotalInsertedCoins;
            }

            this.Controls.Add(TextBox1);

            // Money aspect of machine

            Label Money;
            Money = new Label();
            Money.Text = "Insert Coins Here:";
            Money.Location = new Point(20, 100);
            this.Controls.Add(Money);

            //Money buttons will be here


            // Drink aspect of machine

            Label Drinks;
            Drinks = new Label();
            Drinks.Text = "Choose Your Drink:";
            Drinks.Location = new Point(315, 100);
            Drinks.AutoSize = true;
            this.Controls.Add(Drinks);

            //Drink buttons will be here
       }
    }

    public class Test
    {
        public static void Main()
        {
            CokeForm ColaForm;
            ColaForm = new CokeForm();
            Application.Run(ColaForm);
        }
    }
}

How do I fix this problem? Other questions about the CS0120 error don't bring me any further.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
BBB
  • 615
  • 3
  • 12
  • 26

1 Answers1

7

You never create an instance of CokeMachine:

if(CokeMachine.TotalInsertedCoins == 0.00)
{
  TextBox1.Text = "Buy Your Ice Cold Drinks Here!";
}
else
{
  TextBox1.Text = "Inserted Coins: €" + CokeMachine.TotalInsertedCoins;
}

Create an instance of CokeMachine in the form, and then use that.

...
CokeMachine machine = new CokeMachine();
...

if (machine.TotalInstertedCoins == 0.00)
{
 ....
}
Ritch Melton
  • 11,498
  • 4
  • 41
  • 54
  • Thanks, worked like a charm! Another quick question: When I try to add a button to CokeForm the same way: Machine.Coin1.Text = "Test"; this.Controls.Add(Machine.Coin1); I get a nullreferenceException. Do you know how to fix that? – BBB Mar 11 '12 at 05:11
  • 1
    @BrunoCarvalhal: Same thing. Make sure your object references actually have objects in them. – Robert Harvey Mar 13 '12 at 16:29