Autor Wątek: Problem z wystapieniem obiektu w klasie ale w strukturze wszystko jest ok  (Przeczytany 1504 razy)

Offline Radomiej

  • Użytkownik
    • Blog

# Sierpień 30, 2012, 12:51:12
Chciałbym się dowiedzieć czemu tak się dzieję że taka klasa/struktura:
    public class Prowincja
    {
        public int PrzynależnośćGracza;
        public int ID_PROWINCJI;
        public List<Vector2> PolaNależące;
        public List<int> ID_PROWINCJI_GRANICZĄCYCH;

    }
jako klasa ma problem z odwołaniem do obiektu "PolaNależące" w takim kodzie:
 
           map.prowincja = new Prowincja[ameby.Count];
           map.prowincja[0].PolaNależące = new List<Vector2>();
           map.prowincja[0].PolaNależące.Add(new Vector2(20,30)); // tutaj w klasie wyrzuca błąd
a struktura wykonuje się poprawnie. Dodam że powyższy blok wykonawczy działa w wątku.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xion

  • Moderator
    • xion.log

# Sierpień 30, 2012, 13:03:56
Rozumiem że kompilator ma ciche dni i nie chce się podzielić tekstem komunikatu o błędzie?...

Offline FoToN

  • Użytkownik

# Sierpień 30, 2012, 13:04:24
Ponieważ c# to nie c++ i tutaj jest znacząca różnica między klasą i strukturą.

Spójrzmy na kod:
public struct Struktura
{
// ...
}
public class Klasa
{
// ...
}
Struktura[] strukturki = new Struktura[20]; // tablica 20 obiektow Struktura
Klasa[] klasy = new Klasa[20]; // tablica 20 [b]referencji[/b] do obiektu Klasa

Czyli w Twoim przypadku jeśli chcesz by Prowincja była klasą, to musisz przed zmianą jej wartości dać:
map.prowincja[0] = new Prowincja();
Edit: @Xion - Akurat tutaj wyraźnie widać w czym problem, ale ogólnie się zgadzam. Nie dawanie komunikatów o błędach jest brzydkim nawykiem :(

Edit2: Btw. w c# zazwyczaj nie stosuje się pól publicznych (zamiast tego właściwości). Poza tym nazwy TEGO_TYPU nadaje się stałym.
« Ostatnia zmiana: Sierpień 30, 2012, 13:10:17 wysłana przez FoToN »

Offline Radomiej

  • Użytkownik
    • Blog

# Sierpień 30, 2012, 13:20:08
Rozumiem że kompilator ma ciche dni i nie chce się podzielić tekstem komunikatu o błędzie?...

Tutaj kompilator nie traktuje tego jako błędu, po prostu w czasie debugowania wyświetla się informacja że obiekt nie występuje.

Ponieważ c# to nie c++ i tutaj jest znacząca różnica między klasą i strukturą.

Spójrzmy na kod:
public struct Struktura
{
// ...
}
public class Klasa
{
// ...
}
Struktura[] strukturki = new Struktura[20]; // tablica 20 obiektow Struktura
Klasa[] klasy = new Klasa[20]; // tablica 20 [b]referencji[/b] do obiektu Klasa

Czyli w Twoim przypadku jeśli chcesz by Prowincja była klasą, to musisz przed zmianą jej wartości dać:
map.prowincja[0] = new Prowincja();
Edit: @Xion - Akurat tutaj wyraźnie widać w czym problem, ale ogólnie się zgadzam. Nie dawanie komunikatów o błędach jest brzydkim nawykiem :(

Edit2: Btw. w c# zazwyczaj nie stosuje się pól publicznych (zamiast tego właściwości). Poza tym nazwy TEGO_TYPU nadaje się stałym.
Ok, już sobie przypomniałem - ciągle lecę w takich wypadkach na strukturach i chciałem z rozpędu analogicznie zrobić tak z klasami:)

@xion tak, tamte zmienne mają być stałymi, zaraz je przerobię:)

dzięki za pomoc.

Offline Xion

  • Moderator
    • xion.log

  • +2
# Sierpień 30, 2012, 13:22:43
Cytuj
@xion tak, tamte zmienne mają być stałymi, zaraz je przerobię:)
Przecież nic nie mówiłem :)