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

Setter, Getter i Referencja

Object Storage Arubacloud
0 głosów
1,341 wizyt
pytanie zadane 3 sierpnia 2016 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)
Witam,

rozbiłem klasę na 2 pliki. Zrobiłem zmienne jako prywatne. Stworzyłem settery i wszystko działa, ale pojawia się kolejne pytanie, czy mogę zmienić wartość przez setter? Czy muszę użyć referencji dam pliki>>>

plik.h

http://wklej.org/id/2777252/

plik.cpp

http://wklej.org/id/2777253/

A teraz jak nad tym myślałem>>>

1. http://wklej.org/id/2777255/

A więc konstuktor, później odczytuje dmg o sprawdzenia czy wszystko działa (jest ok). Jak widać probuje odczytać exp i poźniej zwiększyć od 1 ptk, wszystko się kompiluje ale liczby to kosmos, a więc ta metoda raczej odpada chyba, że coś źle coś zrobiłem

2. Metoda wymaga zmiany plików, na pliki z referencja>>>>

plik.h, ale raczej tu powinno być pole publiczne.

http://wklej.org/id/2777258/

plik.cpp

http://wklej.org/id/2777259/

2 odpowiedzi

+1 głos
odpowiedź 3 sierpnia 2016 przez NTXFN Gaduła (3,430 p.)
wybrane 3 sierpnia 2016 przez DragonCoder
 
Najlepsza

Nie do końca rozumiem pytanie. Proszę spojrzeć na to:

//interface.h
#ifdef...
class Klasa {
   private:
      int x, y;
   public:
      Klasa();
      int getX();
      int getY();
      void setX(int xx);
      void setY(int yy);
}
#endif

//implementation.cpp 
#include <iostream>
#include "interface.h"

Klasa::Klasa() {
   //...
}

int Klasa::getX() {
   return x;
}

int Klasa::getY() {
   return y;
}

void setX(int xx) {
   x = xx;
}

void setY(int yy) {
  y = yy;
}



int main() {
   Klasa k();
   k.setX(10);
   k.setY(8);
   std::cout << k.getX() << " " << k.getY() << std::endl;
   return 0;
}

Powinno działać. Możesz też w wywołaniu getX zwracać freferencję do x :

int x = k.getX();

int & Klasa::getX() {
   return x;
}

 

komentarz 3 sierpnia 2016 przez DragonCoder Nałogowiec (36,500 p.)
Tu kest przypisanie wartosci, a ja ja musze zmieniac co cjwile. Jak klikne 1 to zwieksza sie length o 1 itd
komentarz 3 sierpnia 2016 przez NTXFN Gaduła (3,430 p.)
edycja 3 sierpnia 2016 przez NTXFN

No to możesz tak: 

setX(getX() + 1);
//lub z refernecją:
getX() += 1;

 

 

Skoro możesz pobrać i przypisać wartość to możesz ją zwiększyć o 1. Słowo kluczowe private znaczy że nie możesz zrobić tak:

Klasa k();
k.x = 10;
k.y = 8;
k.x++;
 

To jest po to aby ktoś nie mieszał się w to jak Ty tą klasę napisałeś. Ty możesz zmienić coś w klasie i w metodach, ale one pozostaną kod który używa tą klasę się nie zmieni. To co jest prywatne jest niewidzialne poza klasą, ale widzialne w tej klasie. Jeże l=chcesz tworzyć klasy potomne (dziedziczenie) to możesz to oznaczyć jako protected i wtedy zmienne będą widoczne również w klasach pochodnych. ukrywanie właściwości klas nazywa się hermetyzacją. Polecam obejrzeć ten film: https://www.youtube.com/watch?v=oNgs9LeiIqw

komentarz 3 sierpnia 2016 przez DragonCoder Nałogowiec (36,500 p.)
aha czyli zwiększam zmienna przez etter ale odczytując jej wcześniejszą wartość, czyli robiłem to dobrze. Dziękuje
komentarz 3 sierpnia 2016 przez NTXFN Gaduła (3,430 p.)
Nie zapomnij dać mi najlepszej odpowiedzi i łapki w górę ^^ to moja pierwsza odpowiedź
komentarz 3 sierpnia 2016 przez DragonCoder Nałogowiec (36,500 p.)
Dałem, ale zostane przy samych setterach, bo funkcji by była o wiele za dużo, funkcji użyje później, ale dziękuje
+1 głos
odpowiedź 3 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)

To, że w klasie zmienne są prywatne nie znaczy, że nie możesz ich modyfikować bezpośrednio w metodach tej klasy x)
Tak więc przykładowo:
class Character
{
int HP;
public:
   int GetHP(){return HP};
   void SetHP(int Value){HP=Value;} 
//Modyfikowanie zmiennej prywatnej bezpośrednio w klasie
   void SetDefaultHP(){HP=100;} //Modyfikowanie zmiennej prywatnej bezpośrednio w klasie
}
 

komentarz 3 sierpnia 2016 przez DragonCoder Nałogowiec (36,500 p.)
Tak, ale modyfikacja nastepuje po wygranej walce, i po wykonaniu misji itd. I przeciwnika zadaje co 1 sekunde obrazenia 12-25 zalozmy ze walka trwa 12 sekund i wtedy musi to byc zmieniane petla while albo for
komentarz 3 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)

Jeżeli chcesz stworzyć coś w rodzaju buffa to proponuję w klasie bazowej wszystkich przeciwników, czy tam w klasie postaci (zależy gdzie mają być buffy), wstawić zmienne obliczające czas dla konkretnego buffa, następnie stworzyć metodę która obsługiwała by wszystkie buffy (i debuffy), oraz odejmowała odpowiednio od nich wartości (prosta reprezentacja czasu trwania). To wyglądało by mniej więcej tak:

class Character
{
    int HP;
    BuffManager Buffs;
public:
    void addHP(int DeltaValue) {HP+=DeltaValue;}
    void Update()
    {
        //Logika postaci
        //I aktualizacja buffów
        Buffs.Update();
    }
}

struct BuffManager
{
    enum Buffs
    {
        Flame=0, Posion, Hp_Regen, Num_Buffs;
    }
    int Buffs_Tab[Buffs::Num_Buffs];
    
public:
    BuffManager()
    {
        for(size_t i=0; i<Buffs::Num_Buffs; i++) Buffs_Tab[i]=0;
    }
    void Update(Character *Object)
    {
        for(size_t i=0; i<Buffs::Num_Buffs; i++) if(Buffs_Tab[i]>0) Buffs_Tab[i]--;
        
        //Flame
        if(Buffs_Tab[Buffs::Flame])
        {
            Object.AddHP(-5);
        }
        
        //Posion
        if(Buffs_Tab[Buffs::Posion])
        {            
            Object.AddHP(-2);
        } 
        
        //Hp_Regen
        if(Buffs_Tab[Buffs::Hp_Regen])
        {
            Object.AddHP(1);            
        }
    }
}

 

komentarz 3 sierpnia 2016 przez DragonCoder Nałogowiec (36,500 p.)
Nie, buffy czy skille jak to woli, będę robić później ok, dam przykładowy kod jakby to było na zmiennych i publicznych w klasach.

http://wklej.org/id/2777297/

To taki nieskończony przykład.

 

Na klasach by było tak samo, mówimy o publicznych, tylko że musłbym dać konstruktory. Ok a teraz muszę zrobić coś takiego tylko, że z klasą prywatną, z tego powodu zapytałem jak mam zmienić wartośc w konstruktorze przez setter? Czy też muszę użyć referencji.?

Tylko na tym polega mój problem, jak zmienić Hp tego bohatera za pomocą settera, a jak się nie da to proszę powiedzieć, że muszę użyć referencji
komentarz 3 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)

Dlaczego np. nie zastąpisz takiego kodu:
lifeChicken=lifeChicken-damageDefender;
lifeDefender=lifeDefender-damageChicken;

Takim:
Chicken.addLife(-Defender.getDamage());
Defender.addLife(-Chicken.getDamage());

gdzie:
Chicken::addLife(int Value) { Life+=Value; }
Defender::addLife(int Value) { Life+=Value; }
Chicken::getDamage() { return Damage; }
Defender::getDamage() { return Damage; }

komentarz 3 sierpnia 2016 przez DragonCoder Nałogowiec (36,500 p.)
A więc wystarczy stworzyć funcję, która odejmuje hp o określona liczbę? Czyli w tym przypadku jest to damage.... NO ok, ale czy to nie zwiększy lini kodu i zużycia pamięci, a poza tym, później dochodzi kilka rzeczy które zmienia, życie, siłe dmg obrone itd.... TO co było pokazane to tylko początek bez niczego
komentarz 3 sierpnia 2016 przez NTXFN Gaduła (3,430 p.)
Obejrzyj ten film co Ci pokazałem a Cię oświeci! Jak chcesz zmienić jakąś wartość to dodaj metody w stylu getHP() setHP() lub damage(lie_odebrac). To chyba najlepszy sposób i wszyscy tak robią.
komentarz 3 sierpnia 2016 przez DragonCoder Nałogowiec (36,500 p.)
Tylko, że wtedy muszę dodać potwora
komentarz 3 sierpnia 2016 przez NTXFN Gaduła (3,430 p.)
Nie rozumiem. Jak go dodasz to potem możesz zwiększyć/zmniejszyć jakąś wartość. Gdzie jest problem?
komentarz 3 sierpnia 2016 przez DragonCoder Nałogowiec (36,500 p.)
Że to jest około 170 konstruktorów :D dlatego też robienie funkcji odejmij tyle i tyle przy potworze to też problem, a settery działąją dobrze z tego też powodu myślę, że przy nich zostanę narazie, ale funkcji użyje później...
komentarz 3 sierpnia 2016 przez NTXFN Gaduła (3,430 p.)

Daj kod uproszczonego przyładu. Masz kilka potworów:

class Monster {
   private:
      int x;
      int y;
   public:
      void addToX(int ile) {
         x += ile;
      }
}

class Smok: Monster {
      //Ten smok też ma tą metodę bo dziedziczy po potworze
}

To nie ważne ile masz konstruktorów i nie wiem co one z tym mają wspólnego.

Podobne pytania

0 głosów
1 odpowiedź 688 wizyt
pytanie zadane 5 sierpnia 2016 w C# przez niezalogowany
+1 głos
2 odpowiedzi 475 wizyt
pytanie zadane 13 września 2015 w C i C++ przez Iras Obywatel (1,800 p.)
+2 głosów
3 odpowiedzi 1,236 wizyt
pytanie zadane 15 lipca 2017 w C i C++ przez Bondrusiek Maniak (61,370 p.)

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...