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. 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 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. |
|
pekfos |
» 2019-02-01 19:07:36 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ć. Zarządzanie pamięcią new, delete |
|
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. |
|
pekfos |
» 2019-02-01 19:47:27 Nie istnieje. Działa przez przypadek. |
|
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? |
|
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? |
|
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: Zarządzanie pamięcią new, deleteNo 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. |
|
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. |
|
« 1 » 2 |