CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z C# i przekazywaniem danych między klasami

Problem z C# i przekazywaniem danych między klasami

dział ogólny

Problem z C# i przekazywaniem danych między klasami

Nowy postprzez nvdante » środa, 30 grudnia 2015, 17:33

Witam serdecznie!

Za zgodą administratora zamieszczam pytanie z C#, być może ktoś wie, jak to poprawić:

Problem polega na tym, że klasa ruch dziedziczy po klasie mob_01, bo mogę wywołać metody, ale nie mogę pobrać wartości pola pozycja_mobx. Pole hp pobieram prawidłowo, a pozycja_mobx w wyniku podaje 0, zamiast właściwej liczby.
Czy problem może być związany z tym, że dane do zmiennej pozycja_mobx są generowane losowo?

KOD cpp:     UKRYJ  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Galaxy
{
    class Program
    {
        static void Main(string[] args)
        {
                ruch postac = new ruch();
                postac.PozycjaStartowa();
                mob_01 potworek=new mob_01();
               
                while (postac.koniec != 1)
            {
                        potworek.WyswietlMob_01();
                        postac.Ruch();
            }

            Console.ReadKey();
        }
    }
}
 


KOD cpp:     UKRYJ  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Galaxy
{
        class mob_01
        {
                int hp=10;
                int znacznik;
                int pozycja_mobx;
                int pozycja_moby;
               
                void LosujPozycje()
                {
                Random random = new Random();
                pozycja_mobx = random.Next(10, 20);
                pozycja_moby = random.Next(10, 20);
        znacznik=1;
                }
               
                public void WyswietlMob_01()
                {
                        if (znacznik==0)
                                LosujPozycje();
                       
                        Console.SetCursorPosition(pozycja_mobx, pozycja_moby);
                        Console.WriteLine("oOo");
                }

        public void przekaz_dane()
        {
            Console.WriteLine(pozycja_mobx);
        }

        }
}
 


KOD cpp:     UKRYJ  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Galaxy
{
        class ruch:mob_01
        {
                int pozycja_x=40;
                int pozycja_y=22;
                int poz_strzal_x;
                int poz_strzal_y;
                public int koniec=0;
                               
                public void PozycjaStartowa()
                {
                        Console.Clear();
                        Console.SetCursorPosition(40, 22);     
                        Console.WriteLine("_^_");
                }
               
                public void Ruch()
                {
                        ConsoleKeyInfo Klawisz = Console.ReadKey(true);
            if (Klawisz.Key == ConsoleKey.LeftArrow)
            {
                if (pozycja_x > 0)
                    pozycja_x -= 1;
                else
                    pozycja_x = 0;
                        }
           
            else if (Klawisz.Key == ConsoleKey.RightArrow)
            {
                if (pozycja_x < 77)
                    pozycja_x += 1;
                else
                    pozycja_x = 77;
                        }
           
            else if (Klawisz.Key == ConsoleKey.UpArrow)
            {
                Strzelaj();
            }
         
            if (Klawisz.Key == ConsoleKey.Q)
            {
                koniec = 1;
                System.Environment.Exit(1);
            }
           
                Console.Clear();
                Console.SetCursorPosition(pozycja_x, pozycja_y);
                Console.WriteLine("_^_");
                }
               
                public void Strzelaj()
                {
                        poz_strzal_x = pozycja_x+1;
                        poz_strzal_y = pozycja_y-1;
                        while (poz_strzal_y > 0 )
                        {
                                Console.SetCursorPosition(poz_strzal_x, poz_strzal_y);
                Console.WriteLine("|");
                przekaz_dane();
                                System.Threading.Thread.Sleep(25);
                                poz_strzal_y--;
                        }
                }
        }
}
 
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows VistaChrome

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez polymorphism » środa, 30 grudnia 2015, 19:51

Czy problem może być związany z tym, że dane do zmiennej pozycja_mobx są generowane losowo?

Jeśli piszesz o postac, to ja nigdzie nie widzę, żebyś wywoływał LosujPozycje.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez nvdante » środa, 30 grudnia 2015, 22:55

Wywołuję potworek.WyswietlMob_01(), ta z kolei wywołuje LosujPozycje().
Postac jest do klasy ruch, a losowanie robię w klasie mob_01.
Dodam, że LosujPozycje() na pewno się wykonuje, bo jak dorzucę tam wyświetlenie na konsolę parametrów to pojawią się inne niż 0, a przekazane dalej wyzerują się.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez polymorphism » środa, 30 grudnia 2015, 23:26

Z twojego opisu zrozumiałem, że masz problem z pochodną klasy mob_01, czyli ruch. Nie widzę, żeby gdzieś obiekt tej klasy (postac) miał ustawiane wspomniane pola.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez nvdante » środa, 30 grudnia 2015, 23:36

Chyba nie do końca to rozumiem, więc jeszcze raz nakreślę o co mi chodzi.
Klasa mob_01 tworzy potworka, losuje jego pozycję, itd. To działa dobrze, bo jego miejsce na ekranie się zmienia i wartość zmiennej też.
Klasa ruch ma jedynie odczytać wartość pola pozycja_mobx poprzez metodę pobierz_dane(), która jest wywoływana w metodzie strzelaj() klasy ruch.
Jedyne co potrzebuję to przeciągnięcie wartości pozycja_mobx do klasy ruch.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez polymorphism » środa, 30 grudnia 2015, 23:57

Klasa ruch ma jedynie odczytać wartość pola pozycja_mobx poprzez metodę pobierz_dane(), która jest wywoływana w metodzie strzelaj() klasy ruch.

Problem w tym, że nie widzę nigdzie wywołania pobierz_dane w strzelaj :D Jedyne co tam jest to przekaz_dane, ale ona nie robi nic poza wypisaniem wartości do konsoli.

Dobra, inaczej. Którą pozycja_mobx chcesz wypisać? Tą z obiektu postac czy potworek?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez nvdante » czwartek, 31 grudnia 2015, 04:22

Mój błąd ;) Oczywiście chodzi o przekaz_dane().
Tak naprawdę jest tylko jedna pozycja_mobx w obiekcie potworek ( klasy mob_01 ) i tę chcę przeciągnąć do obiektu postać ( klasy ruch ).
Potworek ma podać swoje współrzędne, żeby postać wiedziała w co strzela i czy trafiła ;)
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez polymorphism » czwartek, 31 grudnia 2015, 12:02

W takim razie musisz przekazać jakoś potworek do obiektu postac. Najprościej będzie przekazać w parametrze metody Ruch.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez nvdante » czwartek, 31 grudnia 2015, 13:39

Naprawdę jest to konieczne?
Pytam, bo gdy w klasie mob_01, w metodzie przekaz_dane() zamiast pozycja_mobx wstawię hp to odwołanie będzie prawidłowe, czyli komunikacja między klasami jest właściwa.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez polymorphism » czwartek, 31 grudnia 2015, 15:34

Ktoś tu chyba nie rozumie dziedziczenia. hp Ci działa, bo to pole ma przypisywaną wartość domyślną, zatem wszystkie obiekty klasy mob_01 i jej pochodnych będą miały taką samą wartość początkową tego pola. Coś mi się wydaje, że założyłeś sobie to tak, że jeśli w jednym obiekcie zmienisz wartość pozycja_mobx, to w pozostałych obiektach też się zmieni. No niestety, tak to nie działa. Każdy obiekt ma swoje własne pole pozycja_mobx.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez nvdante » czwartek, 31 grudnia 2015, 15:45

Wydawało mi się, że dziedziczenie polega na tym, że klasa pochodna może wziąć od klasy rodzica dane bez dodatkowego przekazywania.
Masz rację, tak właśnie założyłem ;)
Biorę się w takim razie za przekazanie wartości pozycja_mobx jako parametr do klasy ruch.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez nvdante » czwartek, 31 grudnia 2015, 15:58

Chyba coś źle robię, bo dostaję komunikat:
error CS0146: Circular base class dependency involving 'Galaxy.ruch' and 'Galaxy.mob_01'

KOD cpp:     UKRYJ  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Galaxy
{
        class mob_01:ruch // ------------------------------------------------------------- zmiana
        {
                int hp=10;
                int znacznik;
        int pozycja_mobx;
                int pozycja_moby;

                void LosujPozycje()
                {
                Random random = new Random();
        pozycja_mobx = random.Next(10, 20);
                pozycja_moby = random.Next(10, 20);
        Strzelaj(pozycja_mobx); // ------------------------------------------------------------- zmiana
        znacznik=1;
        }
               
                public void WyswietlMob_01()
                {
                        if (znacznik==0)
                                LosujPozycje();
                       
                        Console.SetCursorPosition(pozycja_mobx, pozycja_moby);
                        Console.WriteLine("oOo");
                }

        }
}
 


KOD cpp:     UKRYJ  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Galaxy
{
        class ruch:mob_01
        {
                int pozycja_x=40;
                int pozycja_y=22;
                int poz_strzal_x;
                int poz_strzal_y;
                public int koniec=0;
                               
                public void PozycjaStartowa()
                {
                        Console.Clear();
                        Console.SetCursorPosition(40, 22);     
                        Console.WriteLine("_^_");
                }
               
                public void Ruch()
                {
                        ConsoleKeyInfo Klawisz = Console.ReadKey(true);
            if (Klawisz.Key == ConsoleKey.LeftArrow)
            {
                if (pozycja_x > 0)
                    pozycja_x -= 1;
                else
                    pozycja_x = 0;
                        }
           
            else if (Klawisz.Key == ConsoleKey.RightArrow)
            {
                if (pozycja_x < 77)
                    pozycja_x += 1;
                else
                    pozycja_x = 77;
                        }
           
            else if (Klawisz.Key == ConsoleKey.UpArrow)
            {
                Strzelaj();
            }
         
            if (Klawisz.Key == ConsoleKey.Q)
            {
                koniec = 1;
                System.Environment.Exit(1);
            }
           
                Console.Clear();
                Console.SetCursorPosition(pozycja_x, pozycja_y);
                Console.WriteLine("_^_");
                }
               
                public void Strzelaj(int pozycja_mobx) // ------------------------------------------------------------- zmiana
                {
                        poz_strzal_x = pozycja_x+1;
                        poz_strzal_y = pozycja_y-1;
                        while (poz_strzal_y > 0 )
                        {
                                Console.SetCursorPosition(poz_strzal_x, poz_strzal_y);
                Console.WriteLine("|");
                                System.Threading.Thread.Sleep(50);
                                poz_strzal_y--;
                        }
                }
        }
}
 
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez polymorphism » czwartek, 31 grudnia 2015, 15:59

Wydawało mi się, że dziedziczenie polega na tym, że klasa pochodna może wziąć od klasy rodzica dane bez dodatkowego przekazywania.

Żadnego "dodatkowego przekazywania" nie trzeba jeśli postac chce dobrać się do własnego pola pozycja_mobx! Twierdzisz, że pole to ma wartość 0. I wszystko jest ok, ponieważ nigdzie tej wartości nie ustawiasz. Ustawiasz ją (a raczej losujesz) w obiekcie potworek, ale on ma się nijak do obiektu postac.


Chyba coś źle robię (...)
KOD cpp:     UKRYJ  
class mob_01:ruch

No. ruch dziedziczy po mob_01, więc po kiego grzyba mob_01 ma dziedziczyć po ruch, a co za tym idzie po sobie samym?! Kompletny bezsens.

W dziedziczeniu jest tak, że klasy bazowe nic nie wiedzą o klasach pochodnych.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez nvdante » czwartek, 31 grudnia 2015, 16:32

polymorphism napisał(a):postac chce dobrać się do własnego pola pozycja_mobx!

Czemu mówisz, że własnego pola, skoro pozycja_mobx to pole klasy potworek, a nie postac? Dlatego, bo dziedziczy i to jej pole?

polymorphism napisał(a):Ustawiasz ją (a raczej losujesz) w obiekcie potworek, ale on ma się nijak do obiektu postac.

OK, czyli dlatego mam przekazać wartość z potworek do postac, żeby nie ustawiać, tak?

polymorphism napisał(a):No. ruch dziedziczy po mob_01, więc po kiego grzyba mob_01 ma dziedziczyć po ruch, a co za tym idzie po sobie samym?! Kompletny bezsens.

Ale jeżeli mob_01 nie będzie dziedziczył po ruch to nie wywoła metody Strzelaj, której parametr ma dostarczyć.
Możesz podać jakiś przykład, bo chyba błądzę po omacku.
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z C# i przekazywaniem danych między klasami

Nowy postprzez polymorphism » czwartek, 31 grudnia 2015, 19:19

Dlatego, bo dziedziczy i to jej pole?

Tak.

OK, czyli dlatego mam przekazać wartość z potworek do postac, żeby nie ustawiać

Jeśli chcesz żeby postac wiedziała gdzie jest jest potworek, musisz jakoś tę informację dostarczyć.

Możesz podać jakiś przykład, bo chyba błądzę po omacku.

Nie znam C#, ale coś w ten deseń:
KOD cpp:     UKRYJ  
while (postac.koniec != 1)
{
        potworek.WyswietlMob_01();
        postac.Ruch(potworek);
}

...


class mob_01
{
        protected int pozycja_mobx;
        protected int pozycja_moby;
        ...

        public int get_mobx() { return pozycja_mobx; }
        public int get_moby() { return pozycja_moby; }
        ...
       
}


class ruch: mob_01
{


        public void Ruch(mob_01 mob)
        {
                ...

                else if (Klawisz.Key == ConsoleKey.UpArrow)
                {
                        Strzelaj(mob);
                }
               
                ...
        }

        public void Strzelaj(mob_01 mob)
        {
                ... = mob.get_mobx();
                ... = mob.get_moby();
               
                ...

        }
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
nvdante
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 55 gości

cron