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

question-closed Błędy przy wskaźnikach?

42 Warsaw Coding Academy
0 głosów
402 wizyt
pytanie zadane 12 lipca 2015 w C i C++ przez criss Mędrzec (172,590 p.)
zamknięte 17 listopada 2016 przez criss

Powoli pisze sobie gierke w konsoli. Mam problem przy nakładaniu przedmiotów (na postać). Przedmioty są podzielone na kilka klas typu zbroja, helm itd. Wszystkie dziedziczą z jednej klasy wirtualnej, zalozmy Cloth.
Ekwipunek jest wektorem wskaźników Cloth. Poniżej funkcje klasy postaci odpowiedzialne za nakładanie/zdejmowanie przedmiotów (dla broni funkcja jest przeciążona z widocznych powodów) :

template <class T>
void cloth_on(T* w)
{
   if(this->hlvl>=w->lvl){
     this->def+=w->def;
     if(w->bid!=0){
                     if(w->bid==1) this->maxhp+= w->b_pow;
                     else if(w->bid==2) this->def+= w->b_pow;
                     else if(w->bid==3) this->rzuty+= w->b_pow;
                     else if(w->bid==4) this->dmg+= w->b_pow;
                     else if(w->bid==5) this->crt+= w->b_pow;
                  }
     w->on=true;
   }
}

void cloth_on(Miecz* w)
{
     if(this->hlvl>=w->lvl)
     {
               w->on=true;
               rzuty+=w->rzuty;
               dmg+=w->dmg;
               crt+=w->crt;
        if(w->bid!=0){
                     if(w->bid==1) this->maxhp+= w->b_pow;
                     else if(w->bid==2) this->def+= w->b_pow;
                     else if(w->bid==3) this->rzuty+= w->b_pow;
                     else if(w->bid==4) this->dmg+= w->b_pow;
                     else if(w->bid==5) this->crt+= w->b_pow;
                  }
              }
}

template <class U>
void cloth_off(U* w)
{
     this->def-=w->def;
     if(w->bid!=0){
                     if(w->bid==1) this->maxhp-= w->b_pow;
                     else if(w->bid==2) this->def-= w->b_pow;
                     else if(w->bid==3) this->rzuty-= w->b_pow;
                     else if(w->bid==4) this->dmg-= w->b_pow;
                     else if(w->bid==5) this->crt-= w->b_pow;
                  }
     w->on=false;
}
void cloth_off(Miecz* w)
{
              w->on=false;
              rzuty-=w->rzuty;
              dmg-=w->dmg;
              crt-=w->crt;
        if(w->bid!=0){
                     if(w->bid==1) this->maxhp-= w->b_pow;
                     else if(w->bid==2) this->def-= w->b_pow;
                     else if(w->bid==3) this->rzuty-= w->b_pow;
                     else if(w->bid==4) this->dmg-= w->b_pow;
                     else if(w->bid==5) this->crt-= w->b_pow;
                  }
}

Konkretnie chodzi o to, że postać dostaje kompletnie randomowe wartości obrony, dmg itd. W przypadku obrony są to czesto liczby olbrzymie, ale czasami też zero. Wspominam o tym, bo w przypadku innych statystyk są to liczby znacznie bliżej tej właściwej. Dmg i rzuty są czasami nawet dodawane poprawnie :D . Przy zdejmowaniu jest odejmowana ta sama wartość która została dodana przy założeniu.
Wywołania wyglądają tak:

h.cloth_off(v[choice]);

h.cloth_on(v[choice]);

hero - obiekt klasy postaci, v- wektor ekwipunku

komentarz zamknięcia: .

2 odpowiedzi

0 głosów
odpowiedź 12 lipca 2015 przez Buby Pasjonat (19,590 p.)
wybrane 12 lipca 2015 przez criss
 
Najlepsza

Kolego, a mam takie jedno pytanie - czy konstruktor domyślny postaci zeruje startowo te wartości, bądź inicjalizuje jakąś wartością? Bo jeśli nie, to wartości, które dodaje funkcja są sumowane ze śmieciami, które znajdowały się w pamięci poprzednio. Mógłbyś pokazać jeszcze kod konstruktora klasy postaci oraz listę jej składowych?

 

@Edit:

Poza tym, ja w pierwszej kolejności przetestowałbym jakie wartości zawiera twoja składowa b_pow.

Możesz np. zmodyfikować kod w ten sposób i stwierdzić, czy wartości które przechowuje są poprawne dodając np. operację wyjścia w którymś z if'ów. :)

komentarz 12 lipca 2015 przez criss Mędrzec (172,590 p.)
Dodawałem je na szybko przed chwilą :P za chwile zobacze.
komentarz 12 lipca 2015 przez Buby Pasjonat (19,590 p.)
Na 90% to jest problemem - używasz wskaźnika do klasy cloth, więc posługując się wskaźnikiem this używasz wartości składowej z tej klasy, ponieważ przechowujesz adres obiektu w wskaźniku polimorficznym.

A tworząc klasę inicjalizujesz składową klasy pochodnej, a nie bazowej. Proszę, powiedz, że teraz działa, bo to jest pomysł ostateczny i logicznie wyjaśnia dlaczego tak się dzieje.
komentarz 12 lipca 2015 przez criss Mędrzec (172,590 p.)

Cóż, wzystkie przedmioty poza klasą Miecz są zakładane i zdejmowane poprawnie. Ale w Mieczu atrybuty zawsze są odejmowane o_O pole on zmienia sie poprawnie, ale reszta jest odejmowana niezależnie od użytej funkcji.

update: jeszcze pokombinuje, ale wieczorem, narazie musze lecieć.

komentarz 12 lipca 2015 przez Buby Pasjonat (19,590 p.)

Okej, daj znać, czy się udało.

A tutaj przykład czego NIE robić i dlaczego.

#include <iostream>

class A
{
    public:
        int x;
        A(){}
};

class B: public A
{
    public:
        int x;
        B(int n): x(n){}
};

int main( void )
{
    B Obiekt(10);
    A* Wskaznik = &Obiekt;

    std::cout << "Kiedy odczytuje z obiektu pochodnego: " << Obiekt.x << std::endl;
    std::cout << "Kiedy odczytuje z wskaznika polimorficznego na klase bazowa: " << Wskaznik->x << std::endl;

    return 0;
}

Output:

Kiedy odczytuje z obiektu pochodnego: 10
Kiedy odczytuje z wskaznika polimorficznego na klase bazowa: 4272976

 

komentarz 12 lipca 2015 przez criss Mędrzec (172,590 p.)
Ok, już wszystko ładnie działa :D Kopiowałem część kodu i zapomniałem zamienić - na +. Dzięki za pomoc :)
0 głosów
odpowiedź 12 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
Mógłbyś podać kod "h.cloth_on"?

Jak i prostą definicję klasy tego clouthu. (przedmiotu)

Podejrzewam że błąd jest w cloth_on gdyż zły adres pobiera.

Albo w obiekcie przedmiotu gdyż dziwną wartośc posiada.

 
Zrób test -- stwórz przedmiot a następnie sprawdz statystyki czy wszystko ok.

Jeśli tak to problem leży w metodzie.
komentarz 12 lipca 2015 przez criss Mędrzec (172,590 p.)

Zrób test -- stwórz przedmiot a następnie sprawdz statystyki czy wszystko ok.

W obiekcie przedmiotu jest wszystko ok.
Kod jest w spoilerze.
 

komentarz 12 lipca 2015 przez Dorion300 Szeryf (90,250 p.)

Nie żebym wnikał ale nie powinno być?:

h.cloth_on<Tutaj_wpisz_tyb_zmiennej>(v[choice]);

 

 

komentarz 12 lipca 2015 przez criss Mędrzec (172,590 p.)
Przy wywołaniu na pewno nie. Przy definicji/deklaracji tak, ale w specjalizacjach szablonów bodajze, tutaj mam zwykłe przeciążenie.
komentarz 12 lipca 2015 przez Buby Pasjonat (19,590 p.)
Nie, ponieważ to jest funkcja szablonowa, a nie cała klasa.
komentarz 12 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
Wiem że to jest funkcyjna.

Ale co ma Miecz do ubrania? (np. zakładasz pierścień za pomocą w której zakładasz miecz)

no chyba że ekwipujesz broń to zwracam honor.

Podobne pytania

0 głosów
1 odpowiedź 939 wizyt
0 głosów
1 odpowiedź 209 wizyt
pytanie zadane 14 listopada 2015 w C i C++ przez Kloda Użytkownik (760 p.)
0 głosów
1 odpowiedź 620 wizyt

93,377 zapytań

142,380 odpowiedzi

322,530 komentarzy

62,727 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...