Autor Wątek: Wskazniki oraz bloki Unsafe w klasach  (Przeczytany 1519 razy)

Offline Frondeus

  • Użytkownik

# Sierpień 03, 2008, 20:20:32
Mam problem.. Tworzę prosta grę w c# + XNA. Mam świat w którym jest np. 100 mieczy. (Klasa Świat z 100 obiektami klasy miecz). W klasie świat jest także obiekt gracza.
1. Jak zrobić aby Świat był właścicielem Gracza a Gracz Świata(Coś w stylu obukierunkowego friend). Przy deklaracji wcześniejszej klas nie dawało skutku(gdzie w c++ tak robiłem i wszystko działało).

2. Załóżmy ze punkt 1 został rozwiązany...Jak użyć wskaźników aby Gracz bezpośrednio miał dostęp do Obiektów mieczy?

Nie chodzi mi o to jaki jest na to sposób.. tylko o bloki Unsafe.
Otóż:
public class Gracz
{
unsafe
{
public CMiecz* Miecz;
}
public Gracz()
{
Miecz = &pWorld.Miecz[5];
}
}
Przy takim zapisie kod nie chciał się skompilować. Bez bloku unsafe tez.

Proszę o pomoc.
Z góry dziękuje.

Offline Mr. Spam

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

Offline Kos

  • Użytkownik
    • kos.gd

# Sierpień 03, 2008, 20:32:45
Nie znam tego języka od strony praktycznej, ale nadmienię że C# jest właśnie dlatego zorientowany wokół referencji, żebyś nie musiał używać tylu wskaźników co w C++. :)

poopa

  • Gość
# Sierpień 03, 2008, 21:26:10
1. Poczytaj o interface-ach.

2. To co Kos... czyli:
Jaka jest różnica pomiędzy tymi dwoma w c#-ie?
struct SupaInt1
{
  int x;
}
class SupaInt2
{
  int x;
}

edit: Nie będę taki...
Pomijając kilka "szczegółów".
Ten drugi to SupaInt1*
« Ostatnia zmiana: Sierpień 03, 2008, 21:28:22 wysłana przez poopa »

Offline Esidar

  • Użytkownik

# Sierpień 03, 2008, 21:37:42
Przy takim zapisie kod nie chciał się skompilować. Bez bloku unsafe tez.

Użyj tablicy. Statycznej albo dynamicznej. Nie będziesz musiał używać "unsafe". Po za tym w C# wskaźników się używa bardzo rzadko. Do "normalnego" pisania używa się referencji.

Tablica statyczna:
public class World
{
    public CMiecz[] Miecze;
    Gracz()
    {
        Miecze = new CMiecz[ 20 ]; // 20 mieczy
    }
}

lub tak (tablica dynamiczna)

public class World
{
    public List<CMiecz> Miecze = new List<CMiecz>();
    Gracz()
    {
        for( int i = 0; i < 20; i++ )
             Miecze.Add( new CMiecz() );
    }
}

a użycie tego jest takie
public class Gracz
{
    public CMiecz Miecz; // to nie jest obiekt ! W C# nie ma obiektów statycznych.
    Gracz()
    {
         Miecz = pWorld.Miecze[5];
    }
}

Offline Frondeus

  • Użytkownik

# Sierpień 08, 2008, 17:55:57
Dziękuje. Wszytko już działa tak jak należy.