Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

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

Ostatnio zmodyfikowano 2019-02-05 18:33
Autor Wiadomość
franchesko
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
pekfos
» 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
franchesko
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
pekfos
» 2019-02-01 19:47:27
Nie istnieje. Działa przez przypadek.
P-173828
franchesko
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
franchesko
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
pekfos
» 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
franchesko
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 2 Następna strona