Błąd w C# : dla niestatycznych pól wymagane jest odwołanie do obiektu

0

Witajcie, mem problem z prostym programem.

Klasa "KlasaMenu" gdzie po wyborze odpowiedniej opcji uruchamia sie odpowiednio albo "KlasaKalkulator.MetodaKalkulator" albo "KlasaBMI.MetodaBMI"

program widzi 2 błędy w miejscu wywołania metod "C# An object reference is required for the non-static field, method, or property" (dla niestatycznego pola, właściwości metody wymagane jest odwołanie do obiektu)

case ConsoleKey.D1:
                        Console.Clear(); KlasaKalkulator.MetodaKalkulator(); break;
 case ConsoleKey.D2:
                        Console.Clear(); KlasaBMI.MetodaBMI(); break;

Pomożenie w jaki sposób sie odwołać do obiektów zadeklarowanych na samym dole w class Program?

namespace ConsoleApp6
{
    public class KlasaMenu
    {
        public static void StartMenu()
        {
            Console.Title = "Menu:";
            while(true)
            {
                Console.Clear();
                Console.WriteLine(">>> Przykłdowe menu <<<");
                Console.WriteLine("1. Program kalkulator");
                Console.WriteLine("2. Program Oblicz BMI");
                Console.WriteLine("3. Koniec");

                ConsoleKeyInfo klawisz = Console.ReadKey();

                switch (klawisz.Key)
                {
                    case ConsoleKey.D1:
                        Console.Clear(); KlasaKalkulator.MetodaKalkulator(); break;
                    case ConsoleKey.D2:
                        Console.Clear(); KlasaBMI.MetodaBMI(); break;
                    case ConsoleKey.Escape:
                    case ConsoleKey.D3:
                        Environment.Exit(0); break;
                    default: break;
                }
            }
        }

    }
    public class KlasaKalkulator
    {
        public double Liczba1 { get; set; }
        public double Liczba2 { get; set; }
        public string Znak { get; set; }

        public KlasaKalkulator(int licz1, int licz2, string zna)
        {
            Liczba1 = licz1;
            Liczba2 = licz2;
            Znak = zna;
        }
        public void MetodaKalkulator()
        {
            double wynik = 0;
            if (this.Znak == "+")
                wynik = Liczba1 + Liczba2;
            else if (this.Znak == "-")
                wynik = Liczba1 - Liczba2;
            Console.WriteLine("Wynik działania [{0}] na liczbach {1} i {2} to: {3}.", Znak, Liczba1, Liczba2, wynik);
        }
    }
    public class KlasaBMI
    {
        public double Waga { get; set; }
        public double Wzrost { get; set; }

        public KlasaBMI(double wag, double wzr)
        {
            Waga = wag;
            Wzrost = wzr;
        }

        public void MetodaBMI()
        {
                double wynikbmi = 0;
                wynikbmi = (Waga) / (Wzrost * Wzrost);
                Console.WriteLine("Twoje BMI to: {0}", wynikbmi);
                if (wynikbmi < 18.5)
                    Console.WriteLine("NIEDOWAGA");
                else if (wynikbmi >= 25.0)
                    Console.WriteLine("NADWAGA");
                else
                    Console.WriteLine("Waga OK");

        }   
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            KlasaKalkulator k1 = new KlasaKalkulator(10, 12, "+");
            KlasaBMI b1 = new KlasaBMI(70, 1.50);

            KlasaMenu.StartMenu();
        }
    }
}
0

Stworzyć obiekty odpowiednich typów używając konstruktorów które tam zdefiniowałeś.

0

Jeżeli chodzi o zadeklarowanie obiektów do tych dwóch klas to są w klasie Program stworzone

KlasaKalkulator k1 = new KlasaKalkulator(10, 12,"+");
KlasaBMI b1 = new KlasaBMI(70, 1.5);
0

Tyle że ich nie używasz. Tylko tworzysz obiekty i nic z nimi nie robisz.
Przekaż je do 'StartMenu()' jako parametry i ich użyj.

0

No to StartMenu musi przyjmować te obiekty. Potem wołasz na tych obiektach odpowiednie metody a w klasie Program piszesz StartMenu(k1, b1).

0

Zrobiłem to w ten sposób i zasypało mnie błędami:
Pewnie to czego nie potrafię ogarnąć to jakieś podstawy ale pewnie mi jakiś szczegół umknął a nie mogę znaleźć w książce rozwiązania
Będę wdzięczny jak poprawicie ;)

W deklaracji metody start menu:

public static void StartMenu(k1,  b1)

Wywołanie metod:

case ConsoleKey.D1:
                        Console.Clear(); k1.KlasaKalkulator.MetodaKalkulator(); break;
 case ConsoleKey.D2:
                        Console.Clear(); b1.KlasaBMI.MetodaBMI(); break;

i klasa Program:

KlasaMenu.StartMenu(k1, b1);
0

Znajdź różnice:

public static void StartMenu(k1,  b1)

vs

public static void StartMenu(KlasaKalkulator k1, KlasaBMI  b1)

Zapomniałeś już jak się funkcje pisze?

0
Piotrek Nero napisał(a):
public static void StartMenu(KlasaKalkulator k1, KlasaBMI  b1)

faktycznie umknęło mi - dzięki

z tym że nadal jest błąd "Dla niestatycznego pola, metody lub właściwości „KlasaKalkulator.MetodaKalkulator()” wymagane jest odwołanie do obiektu." i taki sam dla drugiej

case ConsoleKey.D1:
                        Console.Clear(); k1.KlasaKalkulator.MetodaKalkulator(); break;
case ConsoleKey.D2:
                        Console.Clear(); b1.KlasaBMI.MetodaBMI(); break;

wstawie jeszcze te metody bo może tam coś pomieszałem

public class KlasaKalkulator
    {
        public double Liczba1 { get; set; }
        public double Liczba2 { get; set; }
        public string Znak { get; set; }

        public KlasaKalkulator(int licz1, int licz2, string zna)
        {
            Liczba1 = licz1;
            Liczba2 = licz2;
            Znak = zna;
        }
        public void MetodaKalkulator()
        {
            double wynik = 0;
            if (this.Znak == "+")
                wynik = Liczba1 + Liczba2;
            else if (this.Znak == "-")
                wynik = Liczba1 - Liczba2;
            Console.WriteLine("Wynik działania [{0}] na liczbach {1} i {2} to: {3}.", Znak, Liczba1, Liczba2, wynik);
        }
    }
0

Weźże ogarnij podstawy.
ma być k1.MetodaKalkulator();

0

Faktycznie może pytałem o banalne sprawy ale myślałem że właśnie do tego jest dział "Nowbie" ;)
Dzięki za pomoc.
Program sie skompilował i uruchomił , menu sie wyswietla ale po wciśnięciu na klawiaturze 1/2 nic sie nie dzieje ;/
Musi być gdzieś inny problem ale raczej chyba do tego nie dojde bo wydaje mi sie że jest wszystko ok

Program wrzuciłem w debuger i wygląda na to że wszystko jest ok: debuger prosi o wpisanie klawisza w menu (1,2 lub 3) później wszystkie metody dostają argumenty i oblicza się wszystko ładnie.

Niestety po normalnym uruchomieniu programu po wciśnięciu 1 lub 2 nic sie nie dzieje. Tylko na 3 i Esc reaguje i zamyka program.

public class KlasaMenu
    {
        public static void StartMenu(KlasaKalkulator k1, KlasaBMI b1)
        {
            Console.Title = "Menu:";
            while (true)
            {
                Console.Clear();
                Console.WriteLine(">>> Przykłdowe menu <<<");
                Console.WriteLine("1. Program kalkulator");
                Console.WriteLine("2. Program Oblicz BMI");
                Console.WriteLine("3. Koniec");

                ConsoleKeyInfo klawisz = Console.ReadKey();

                switch (klawisz.Key)
                {
                    case ConsoleKey.D1:
                        Console.Clear(); k1.MetodaKalkulator(); break;
                    case ConsoleKey.D2:
                        Console.Clear(); b1.MetodaBMI(); break;
                    case ConsoleKey.Escape:
                    case ConsoleKey.D3:
                        Environment.Exit(0); break;
                    default: break;
                }
            }
        }
    }
    public class KlasaKalkulator
    {
        public double Liczba1 { get; set; }
        public double Liczba2 { get; set; }
        public string Znak { get; set; }

        public KlasaKalkulator(int licz1, int licz2, string zna)
        {
            Liczba1 = licz1;
            Liczba2 = licz2;
            Znak = zna;
        }
        public void MetodaKalkulator()
        {
            double wynik = 0;
            if (this.Znak == "+")
                wynik = Liczba1 + Liczba2;
            else if (this.Znak == "-")
                wynik = Liczba1 - Liczba2;
            Console.WriteLine("Wynik działania [{0}] na liczbach {1} i {2} to: {3}.", Znak, Liczba1, Liczba2, wynik);
        }
    }
    public class KlasaBMI
    {
        public double Waga { get; set; }
        public double Wzrost { get; set; }

        public KlasaBMI(double wag, double wzr)
        {
            Waga = wag;
            Wzrost = wzr;
        }
        public void MetodaBMI()
        {
            double wynikbmi = 0;
            wynikbmi = (Waga) / (Wzrost * Wzrost);
            Console.WriteLine("Twoje BMI to: {0}", wynikbmi);
            if (wynikbmi < 18.5)
                Console.WriteLine("NIEDOWAGA");
            else if (wynikbmi >= 25.0)
                Console.WriteLine("NADWAGA");
            else
                Console.WriteLine("Waga OK");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            KlasaKalkulator k1 = new KlasaKalkulator(10, 12, "+");
            KlasaBMI b1 = new KlasaBMI(70, 1.5);

            KlasaMenu.StartMenu(k1, b1);
        }
    }
0

Czy przypadkiem nie próbujesz na siłę wywołać metody bez użycia obiektów? Moim zdaniem co najmniej w dwóch klasach.
program Ci się wykrzacza w "while".
KlasaMenu zachowuje się podobnie do wzorca fasada. Podziel StartMenu na mniejsze metody.

1 użytkowników online, w tym zalogowanych: 0, gości: 1