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

Przekazywanie wartości z klasy do klasy

VPS Starter Arubacloud
0 głosów
403 wizyt
pytanie zadane 7 maja 2017 w C# przez criser Nowicjusz (210 p.)
edycja 7 maja 2017 przez criser

Dzień dobry,

#EDITED

Mam pewien problem, pokażę od razu na kodzie:

public partial class GameWindow : Window
    {
        private Player _player;
        private Maze _maze;
        private Point _dim;
        private int _count = 0;
        static protected Random rand = new Random();
        protected const int lineLengh = 20;
        protected const int bound = 25;
        protected Point start, exit;

        public GameWindow(int w, int h)
        {
            InitializeComponent();
            InitializeObjects(w, h);
            this.Width = bound * 3 + (lineLengh * w) - lineLengh;
            this.Height = bound * 4 + (lineLengh * h);
            // Setting position of objects on grid
            SettingPositions();
            // Render maze
            _maze.RenderMaze(gameGrid);
            // Render player at start position
            _player.Render(gameGrid);
        }

        private void InitializeObjects(int w, int h)
        {
             start = new Point(0, RandomInt(0, h));
            exit = new Point(w, RandomInt(0, h));
            _dim = new Point(w, h);
            _maze = new Maze(w, h);
            _player = new Player(start);   
        }
    }

 public class Maze : GameWindow
    {
        private bool[,] _v = new bool[5, 5];
        public Maze(int w, int h)
        {
            _v[start.X, start.Y] = false;
        }

 public class Point : GameWindow
    {
        private int _x, _y;
        public Point(int a, int b)
        {
            _x = a;
            _y = b;
        }
        public Point(Point p)
        {
            _x = p.X;
            _y = p.Y;
        }
        public Point() { }
        public int X
        {
            get { return _x; }
            set { _x = value; }
        }

        public int Y
        {
            get { return _y; }
            set { _y = value; }
        }
    }

Chodzi o to, że w miejscu: (_v[start.X, start.Y] = false;) - linia 21 dostaję błąd: Additional information: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

Moje pytanie: w klasie GameWindow wartość start dobrze się inicjuje ale za to w klasie Maze, która dziedziczy po klasie GameWindow tak jakby tej wartości "nie widzi", chociaż jest ona protected. Dlaczego? Jak przekazać tę wartość to klasy Maze?

komentarz 7 maja 2017 przez NowyUrzydgownig Mądrala (5,090 p.)
Odpowiedź jest prosta: Nie wywołujesz konstruktora z klasy GameWindow.

1 odpowiedź

+1 głos
odpowiedź 7 maja 2017 przez rafal.budzis Szeryf (85,260 p.)
wybrane 7 maja 2017 przez criser
 
Najlepsza

Musisz uruchomić konstruktor klasy bazowej i przekazać mu odpowiednie wartosci

public Maze(int w, int h) : base(w, h)

taki zapis uruchomi konstruktor GameWindow(int w, int h) który stworzy zmienną start. Błąd wskazuje na to ze zmienna nie miała jeszcze zadnej wartości.

Całość wygląda tak :
 

public class Maze : GameWindow
{
    private bool[,] _v = new bool[5, 5];
    public Maze(int w, int h) : base(w, h)
    {
        _v[start.X, start.Y] = false;
    }
}

 

komentarz 7 maja 2017 przez criser Nowicjusz (210 p.)

Nie do końca o to mi chodziło. Proszę wybaczyć moje roztargnienie ale nie skopiowałem wszystkiego, a tylko te zmienne, przy których występował błąd. Jeśli chciałbym rozwiązać problem sposobem podanym wyżej tj. public Maze(int w, int h) : base(w, h) to dostaję nieskończoną pętlę. Nie wiem dlaczego gdy w konstruktorze w klasie GameWindow utworzę nowy obiekt typu Point czyli mój start to w klasie Maze tak jakby go nie m, a przecież ta klasa dziedziczy po klasie GameWindow. 

komentarz 7 maja 2017 przez rafal.budzis Szeryf (85,260 p.)

Poczytaj o dziedziczeniu i do czego sie to stosuje bo chyba nie załapałeś tematu. najszybciej naprawić to możemy w taki sposób
 

public class Maze
{

        private bool[,] _v = new bool[5, 5];

        public Maze(GameWindow game, int w, int h)

        {

            _v[game.start.X, game.start.Y] = false;

        }
}

 

 

a w kodzie inicjalizacji

_maze = new Maze(this, w,  h);

 

komentarz 7 maja 2017 przez criser Nowicjusz (210 p.)
Dziękuje za cenne porady, problem rozwiązany ale nie tym sposobem, bo on nie zadziałał. Zduplikowałem wartości start i exit to do klasy Maze. Dziękuje za wszelką pomoc.

Podobne pytania

0 głosów
1 odpowiedź 496 wizyt
pytanie zadane 25 maja 2017 w PHP przez Justyna Obywatel (1,210 p.)
0 głosów
1 odpowiedź 334 wizyt
pytanie zadane 2 września 2019 w C# przez XavRock Obywatel (1,390 p.)
0 głosów
1 odpowiedź 220 wizyt
pytanie zadane 30 kwietnia 2021 w C# przez Adamek185wp Obywatel (1,280 p.)

92,454 zapytań

141,262 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...