Wskaźniki wskazują na jeden obiekt mimo że przypisuje je do dwóch oddzielnych
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Wskaźniki wskazują na jeden obiekt mimo że przypisuje je do dwóch oddzielnych

AutorWiadomość
Temat założony przez niniejszego użytkownika
Wskaźniki wskazują na jeden obiekt mimo że przypisuje je do dwóch oddzielnych
» 2019-02-01 18:19:46
Witam, problem opisany w temacie, poniżej deklaracja klasy, a mianowicie rozchodiz się o wskazniki klasy Postać.


Tutaj deklaracja klasy przbieg gry.
C/C++
class PrzebiegGry
{
    int ile_rund;
    int Ktory_gracz;
    Postac * postac1;
    Postac * postac2;
   
public:
    int licznik();
    int losuj_gracza();
    void tworzenie_postaci();
    void usuwanie_postaci();
    void przebieg_gry();
    PrzebiegGry();
};
.


Tutaj definicja klasy przebieg gry
C/C++
void PrzebiegGry::przebieg_gry()
{
   
    int klasa;
   
    cout << "TWORZENIE POSTACI DLA GRACZA NUMER 1" << endl;
   
    do {
        cout << "Jezeli chcesz wybrac Maga wcisnij 1, jezeli chcesz wybrac Wojownika wcisnij 2, jezeli chcesz wybrac Lowce wcisnij 3" << endl;
        cin >> klasa;
    } while( klasa != 1 && klasa != 2 && klasa != 3 );
   
    if( klasa == 1 )
    {
        do {
            cout << "Wybrales Maga, jezeli chcesz wybrac Maga ognia wcisnij 1, jezeli chcesz wybrac Maga wody wcisnij 2" << endl;
            cin >> klasa;
        } while( klasa != 1 && klasa != 2 );
       
        if( klasa == 1 )
        {
            cout << "Wybrales Maga ognia" << endl;
            Mag_ognia gracz1;
            gracz1.rozdzaj_punkty();
            postac1 = & gracz1;
           
        }
        else
        {
            cout << "wybrales Maga wody" << endl;
            Mag_wody gracz1;
            gracz1.rozdzaj_punkty();
            postac1 = & gracz1;;
        }
       
    }
    else if( klasa == 2 )
    {
        do {
            cout << "Wybrales Wojownika, jezeli chcesz wybrac Paladyna wcisnij, jezeli chcesz wybrac Berserka wcisnij 2" << endl;
            cin >> klasa;
        } while( klasa != 1 && klasa != 2 );
       
        if( klasa == 1 )
        {
            cout << "Wybrales Paladyna" << endl;
            Paladyn gracz1;
            gracz1.rozdzaj_punkty();
            postac1 = & gracz1;;
        }
        else
        {
            cout << "Wybrales Berserka" << endl;
            Berserk gracz1;
            gracz1.rozdzaj_punkty();
            postac1 = & gracz1;
        }
    }
    else if( klasa == 3 )
    {
        do {
            cout << "Wybrales Lowce , jezeli chcesz wybrac Lotra  wcisnij 1, jezeli chcesz wybrac Zabojce wcisnij 2" << endl;
            cin >> klasa;
        } while( klasa != 1 && klasa != 2 );
       
        if( klasa == 1 )
        {
            cout << "Wybrales Lotra" << endl;
            Lotr gracz1;
            gracz1.rozdzaj_punkty();
            postac1 = & gracz1;
        }
        else
        {
            cout << "Wybrales Zabojce" << endl;
            Zabojca gracz1;
            gracz1.rozdzaj_punkty();
            postac1 = & gracz1;
        }
    }
   
    cout << "TWORZENIE POSTACI DLA GRACZA NUMER 2" << endl;
   
    do {
        cout << "Jezeli chcesz wybrac Maga wcisnij 1, jezeli chcesz wybrac Wojownika wcisnij 2, jezeli chcesz wybrac Lowce wcisnij 3" << endl;
        cin >> klasa;
    } while( klasa != 1 && klasa != 2 && klasa != 3 );
   
    if( klasa == 1 )
    {
        do {
            cout << "Wybrales Maga, jezeli chcesz wybrac Maga ognia wcisnij 1, jezeli chcesz wybrac Maga wody wcisnij 2" << endl;
            cin >> klasa;
        } while( klasa != 1 && klasa != 2 );
       
        if( klasa == 1 )
        {
            cout << "Wybrales Maga ognia" << endl;
            Mag_ognia gracz2;
            gracz2.rozdzaj_punkty();
            postac2 = & gracz2;
        }
        else
        {
            cout << "Wybrales Maga wody" << endl;
            Mag_wody gracz2;
            gracz2.rozdzaj_punkty();
            postac2 = & gracz2;
           
        }
    }
    else if( klasa == 2 )
    {
        do {
            cout << "Wybrales Wojownika, jezeli chcesz wybrac Paladyna wcisnij 1, jezeli chcesz wybrac Berserka wcisnij 2" << endl;
            cin >> klasa;
        } while( klasa != 1 && klasa != 2 );
       
        if( klasa == 1 )
        {
            cout << "wybrales Paladyna" << endl;
            Paladyn gracz2;
            gracz2.rozdzaj_punkty();
            postac2 = & gracz2;
        }
        else
        {
            cout << "wybrales Berserka" << endl;
            Berserk gracz2;
            gracz2.rozdzaj_punkty();
            postac2 = & gracz2;
        }
    }
    else if( klasa == 3 )
    {
        do {
            cout << "Wybrales Lowce , jezeli chcesz wybrac Lotra  wcisnij 1, jezeli chcesz wybrac Zabojce wcisnij 2" << endl;
            cin >> klasa;
        } while( klasa != 1 && klasa != 2 );
       
        if( klasa == 1 )
        {
            cout << "Wybrales Lotra" << endl;
            Lotr gracz2;
            gracz2.rozdzaj_punkty();
            postac2 = & gracz2;
        }
        else
        {
            cout << "Wybrales Zabojce" << endl;
            Zabojca gracz2;
            gracz2.rozdzaj_punkty();
            postac2 = & gracz2;
        }
    }
   
   
   
    postac1->menu();
   
   
}

I w ostatniej linijce kiedy odwołuje się do funkcji menu klasy postac1 ( czyli obiektu gracz1) to w programie pokazuje mi się menu klasy postac2. Jeżeli tą linijke umieszcze przed sekcją TWORZENIE POSTACI GREACZA 2 to wszystko jest wporządku i pokazuje się odpowiednie menu. Głowie się nad tym 2h i nie wiem gdzie jest błąd, a program ten odpalam po pół roku i nie przypominam sobie żeby taki błąd występował  wczesniej tym bardziej że był to program na zaliczenie.
P-173825
» 2019-02-01 19:07:36
C/C++
if( klasa == 1 )
{
    cout << "Wybrales Maga ognia" << endl;
    Mag_ognia gracz1;
    gracz1.rozdzaj_punkty();
    postac1 = & gracz1;
   
}
Po wyjściu z if, obiekt gracz1 przestaje istnieć.
» Kurs C++ » Poziom 5Zarządzanie pamięcią new, delete lekcja
P-173826
Temat założony przez niniejszego użytkownika
» 2019-02-01 19:15:12
W takim razie czemu istnieje obiekt gracz2, skoro jest zadeklarowany w ten sam sposób? Po za tym właśnie dlatego w deklaracji tworze wskaźnik postac który dopiero przy wyborze klasy postaci zostaje przypisany obiektowi, żeby był widoczny globalnie.
P-173827
» 2019-02-01 19:47:27
Nie istnieje. Działa przez przypadek.
P-173828
Temat założony przez niniejszego użytkownika
» 2019-02-01 20:02:24
Przypadek? Sądziłem że jak coś nie działa to nie działa, no ale w każdym razie czy ktoś mógłby pomóc mi rozwiązać ten problem?
P-173829
Temat założony przez niniejszego użytkownika
» 2019-02-01 20:14:06
Ach no i jeszcze raz przypominam że jeżeli linie postac1->menu(); umieści się przed tworzeniem gracza 2 ale już po wyjściu z pętli to działa prawidłowo, to też jest przypadek? Coś mi się nie chce wierzyć. No i dlaczego potem oba wskaźniki tj. postac1 i postac2 wskazują na ten sam obiekt  mimo że ja nigdzie później nie modyfikuje wskaznika postac1 . Przypadek?
P-173830
» 2019-02-01 20:19:47
Przypadek? Sądziłem że jak coś nie działa to nie działa, no ale w każdym razie czy ktoś mógłby pomóc mi rozwiązać ten problem?
Jeśli kod nie działa, to jest błędny, ale błędny kod nie musi zawsze nie działać. Rozwiązanie już podałem:
» Kurs C++ » Poziom 5Zarządzanie pamięcią new, delete lekcja

No i dlaczego potem oba wskaźniki tj. postac1 i postac2 wskazują na ten sam obiekt  mimo że ja nigdzie później nie modyfikuje wskaznika postac1 . Przypadek?
Oba obiekty miały akurat ten sam adres. Nie istnieją oba naraz, więc mogą zajmować ten sam obszar pamięci.
P-173831
Temat założony przez niniejszego użytkownika
» 2019-02-01 20:30:00
Jeżeli użyje się deklaracji Postac gracz1  = new Mag_ognia w tej formie, wtedy nawet sie nie kompiluje, ponieważ zmienna jest poza zasięgiem. A  ja chce żeby tworzenie postaci nastąpywało dokładnie w miejscach w których następuje, nie chce tworzyć każdego obiektu wcześniej.
P-173832
« 1 » 2
 Strona 1 z 2Następna strona