• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Inicjalizowanie obiektu (name does not exist in current content).

Object Storage Arubacloud
0 głosów
360 wizyt
pytanie zadane 19 lutego 2016 w C# przez Kanam102 Nowicjusz (160 p.)

Witam. Uczę się C# razem z książką "C# Rusz głową!". Wykonuję jedno z zadań w niej umieszczonych, jednak natknąłem się na błąd, którego nie potrafię przeskoczyć. Gdy chcę zainicjować obiekt "Bet" w klasie "facet" to bez problemu mogę to zrobić w metodzie tej klasy, jednak nie mogę tego zrobić w samym jej ciele. Czy ktoś jest w stanie pomóc? Używam Visual Studio 15 Community. Wskazanie konkretnych miejsc i błędy są jako komentarze w kodzie. Z góry dziękuję i życzę miłego kodowania przy swoich projektach :)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace wyscig
{
    public class facet
    {
        public string imie;
        public Bet zaklad=new Bet(); //to nie działa
        public int kasa;
 
        public RadioButton mojGuzik;
        public Label mojaEtykieta;
 
        zaklad=new Bet(); //to nie działa
 
        public void UpdateLabels()
        {
            mojGuzik.Text = imie + " ma " + kasa + "zł";
            mojaEtykieta.Text = zaklad.DajStatus();
        }
 
        public void WyczyscZaklad()
        {
            zaklad.kwota = 0;
        }
 
        public bool PostawZaklad(int kwota, int wybranyPies)
        {
            if (kwota <= kasa)
            {
                zaklad=new Bet(); //tutaj działa
                zaklad.kwota = kwota;
                zaklad.numerPsa = wybranyPies;
                return true;
            }
            else
            {
                MessageBox.Show(imie + " nie ma wystarczającej ilości kasy", "Problem");
                return false;
            }
 
        }
 
        public void odbierz(int zwycieskiPies)
        {
            kasa = zaklad.wyplac(zwycieskiPies);
            UpdateLabels();
            WyczyscZaklad();
        }
 
 
    }
}
 
 
// Błąd przy próbach gdy nie ma "zaklad=new Bet()" w metodzie:
//CS1519    Invalid token '=' in class, struct, or interface member declaration wyscig 
//CS1520    Method must have a return type 
//CS0501    'facet.Bet()' must declare a body because it is not marked abstract, extern, or partial
//CS0103    The name 'zaklad' does not exist in the current context.   
//CS0109    The member 'facet.Bet()' does not hide an inherited member. The new keyword is not required.

 

3 odpowiedzi

+1 głos
odpowiedź 20 lutego 2016 przez Sareley Gaduła (4,740 p.)

OK. Błędów było jednak kilka przeanalizuj kod.

Klasa Bet:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace wyscig
{
    public class Bet
    {
        public int kwota = 0;
        public int numerPsa;

        public string DajStatus(facet obstawiajacy)
        {
            if (kwota != 0)
            {
                return obstawiajacy.imie + " postawił " + kwota + "zł na psa numer " + numerPsa;
            }
            else
                return obstawiajacy.imie + " nie postawił zakładu";
        }

        public int wyplac(int zwycieskiPies)
        {
            if (zwycieskiPies == numerPsa)
                return kwota;
            else
                return -kwota;
        }
    }
}

Klasa facet:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace wyscig
{
    public class facet
    {
        public string imie;
        public Bet zaklad=new Bet(); //to nie działa
        public int kasa;
 
        // zaklad=new Bet(); //to nie działa

        public RadioButton mojGuzik = new RadioButton();
        public Label mojaEtykieta = new Label();

        public void UpdateLabels()
        {
            mojGuzik.Text = imie + " ma " + kasa + "zł";
            mojaEtykieta.Text = zaklad.DajStatus(this);
        }
 
        public void WyczyscZaklad()
        {
            zaklad.kwota = 0;
        }
 
        public bool PostawZaklad(int kwota, int wybranyPies)
        {
            if (kwota <= kasa)
            {
                zaklad.kwota = kwota;
                zaklad.numerPsa = wybranyPies;
                return true;
            }
            else
            {
                MessageBox.Show(imie + " nie ma wystarczającej ilości kasy", "Problem");
                return false;
            }
 
        }
 
        public void odbierz(int zwycieskiPies)
        {
            kasa = zaklad.wyplac(zwycieskiPies);
            UpdateLabels();
            WyczyscZaklad();
        }
    }
}

Spójrz jeszcze na to że w klasie Bet tworzysz obiekt klasy facet a w klasie facet tworzysz z kolei obiekt klasy Bet. Przez to zapętlasz tworzenie obiektów aż do przepełnienia pamięci. Zamiast tego do metody DajStatus() możesz przesłać obiekt klasy facet żeby wyświetlić informację o statusie ale i tak powinieneś przyjmować tam po prostu stringa lub ewentualnie utworzyć sobie osobną klasę np. Person która zawierałaby informacje o osobach obstawiających i do klasy DajStatus przesyłać parametr takiej właśnie klasy.

komentarz 20 lutego 2016 przez Kanam102 Nowicjusz (160 p.)
Dzięki. Myślałem, że obiekt się tworzy dopiero komendą new [nazwa_klasy](); a nie już samym jej zdefiniowaniem.
komentarz 20 lutego 2016 przez niezalogowany

Myślałem, że obiekt się tworzy dopiero komendą new [nazwa_klasy]();

Bo tak właśnie jest. 

0 głosów
odpowiedź 19 lutego 2016 przez Sareley Gaduła (4,740 p.)
Podaj jeszcze kod klasy Bet.
0 głosów
odpowiedź 19 lutego 2016 przez Kanam102 Nowicjusz (160 p.)

Klasa Bet

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace wyscig
{
    public class Bet
    {
        public int kwota=0;
        public int numerPsa;
        public facet obstawiajacy;

        public string DajStatus()
        {
            if (kwota != 0)
            {
                return obstawiajacy.imie + " postawił " + kwota + "zł na psa numer " + numerPsa;
            }
            else
                return obstawiajacy.imie + " nie postawił zakładu";
        }

        public int wyplac(int zwycieskiPies)
        {
            if (zwycieskiPies == numerPsa)
                return kwota;
            else
                return -kwota;
        }
    }
}

 

komentarz 19 lutego 2016 przez Sareley Gaduła (4,740 p.)
Zakomentuj linię 19 - nie możesz na poziomie klasy próbować odwoływać się do obiektu, poza tym w linii 13 tworzysz już obiekt klasy Bet() wywołując domyślny konstruktor.

W linii 36 nie potrzebujesz tworzyć po raz 2 obiektu klasy bet, ale kod tutaj działa ponieważ na poziomie metody już możesz odwołać się do obiektu.

Sprawdź sobie jeszcze czy w swoim projekcie masz wszystkie referencje do bibliotek np. do Windows.Forms.

Nie widzę więcej błędów, daj znać czy pomogło.
komentarz 20 lutego 2016 przez Kanam102 Nowicjusz (160 p.)
Wystarczyło dodać using System.Windows.Forms do klasy Bet i zaczęło działać. Pozostawiłem tylko linię 13 (nie miałem wszystkich trzech linii na raz, pokazywałem warianty moich prób). Jedyny mój problem to potrzeba ustawienia pola "obstawiajacy" obiektu "Bet" na obiekt "facet", który go tworzy (kombinuję z "this", ale też nie mogę go użyć "in current context"). Ktoś ma jakiś pomysł?

Podobne pytania

0 głosów
1 odpowiedź 439 wizyt
pytanie zadane 23 września 2015 w C i C++ przez patryk16 Obywatel (1,080 p.)
0 głosów
1 odpowiedź 126 wizyt
pytanie zadane 21 marca 2020 w C# przez gmcode Gaduła (3,120 p.)
0 głosów
1 odpowiedź 2,850 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...