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

Zaprzyjaźnione klasy i pobieranie danych miedzy nimi

Object Storage Arubacloud
0 głosów
382 wizyt
pytanie zadane 15 sierpnia 2018 w C i C++ przez Krutek Początkujący (330 p.)
Hej!

Chce stworzyć małą gierke, i chcę aby klasy abstrakcyjne ( w tym wypadku wojownik ) pobrał jedną wartość od innej klasy abstrakcyjnej (miecz) , i tu się pojawia mój problem bo nawet nie wiem czy mój pomysł podziału i podpięcia wszystkiego pod VirtualGameObject ma jakiś sens a co dopiero zaprzyjaźnienie dwóch klas ze sobą,

Link do mojego kodu

https://gist.github.com/krutek/6d6fdbdf48e0652fae613e266ca677dd

Potrzebuje odpowiedzi na następujące pytania:

1) Czy w ogóle mój pomysł dziedziczenia ma jakiś sens ?

2)Czy można tak jak jak jest w kodzie zrobić klase abstrakcyjną od klasy abstrakcyjnej i czy ma to jakikolwiek sens

3) Jak przesłać z klasy bron lub ekwipunek dane o mieczu do klasy wojownik

Dzięki!

1 odpowiedź

0 głosów
odpowiedź 15 sierpnia 2018 przez criss Mędrzec (172,590 p.)
  1. Wygląda sensownie
  2. Tak, można i ma sens
  3. 	void PobierzWartoscAtakuBroni(int obrazenia , int sila , Miecz )
    	{
    		obrazenia = sila + Miecz.WartoscAtakuBroni;
    
    	};

    Nie wiem co próbujesz tu robić. Nie nadałeś nazwy ostatniemu argumentowi. Stwórz sobie w klasie Miecz jakąś metode w stylu `int getAttackVal()` (albo po prostu zostaw WartoscAtakuBroni jako public) i wtedy
    możesz 
     

    	void PobierzWartoscAtakuBroni(int obrazenia , int sila , const Miecz& miecz )
    	{
    		obrazenia = sila + miecz.getAttackVal();
    
    	};

    Druga sprawa, to.. co ma ta funkcja PobierzWartoscAtakuBroni wlasciwie robić? Obecnie nie robi w praktyce nic, bo wynik sumy przypisujesz do zmiennej lokalnej.

komentarz 15 sierpnia 2018 przez Krutek Początkujący (330 p.)
Funkcja PobierzWartoscAtakuBroni  była moją próbą pobrania wartosci ataku z klasy miecz i przekazanie jej do klasy wojownik.

Zmieniłem wartość " WartoscAtakuBroni " na public oraz zastosowałem wpisanie const Miecz& miecz. do funkcji PobierzWartoscAtakuBroni

Tylko że nie wiem co ma robić ta funkcja getAttackVal(); w zasugerowanym przez ciebie kodzie, gdy zamiast funkcji getAttackVal(); wpsiałem WartoscAtakuBroni wyskakują następujące błędy

-brak specyfikatora typu - założono, że int. Uwaga: C++ nie obsługuje domyślnie typu int   
-Błąd    "WartoscAtakuBroni": niezadeklarowany identyfikator

 - "miecz": niezadeklarowany identyfikator       

po lewej ".WartoscAtakuBroni" musi być typ struct/union

błąd składniowy: brakuje „,” przed „&”
komentarz 15 sierpnia 2018 przez criss Mędrzec (172,590 p.)

Zwykły getter. Jeśli zrobiłeś sobie WartoscAtakuBroni  public, to nie ma potrzeby żeby mieć getAttackVal(). No anyway - chodziło o:

int getAttackVal() const { return WartoscAtakuBroni; }

Wracając.. skoro masz tamto public, to:


void PobierzWartoscAtakuBroni(int obrazenia , int sila , const Miecz& miecz )
{
    obrazenia = sila + miecz.WartoscAtakuBroni;
 
};


komentarz 15 sierpnia 2018 przez Krutek Początkujący (330 p.)
Właśnie tak zrobiłem i dalej wywala mi masę błędów , dokładnie te same o których pisałem wyżej
komentarz 15 sierpnia 2018 przez criss Mędrzec (172,590 p.)
Zupdejtuj kod w gistcie, to spojrze. I napisz w których liniach te błędy
komentarz 15 sierpnia 2018 przez Krutek Początkujący (330 p.)
https://gist.github.com/krutek/6d6fdbdf48e0652fae613e266ca677dd
Błąd    C2228    po lewej ".WartoscAtakuBroni" musi być typ struct/union  wojownik.h  wiersz   20   
Błąd    C4430    brak specyfikatora typu - założono, że int. Uwaga: C++ nie obsługuje domyślnie typu int    wojownik.h    wiersz 18  
Błąd    C2143    błąd składniowy: brakuje „,” przed „&”   wojownik.h   wiersz  18
Błąd    C2065    "miecz": niezadeklarowany identyfikator    wojownik.h    wiersz 20   
Błąd    C2065    "WartoscAtakuBroni": niezadeklarowany identyfikator    wojownik.cpp wiersz   26    i 31
komentarz 15 sierpnia 2018 przez criss Mędrzec (172,590 p.)

Wojownik.h i Miecz.h includują sie nawzajem co kończy się nieskonczoną pętlą includowania i stąd dziwne błędy. W pliku wojownik.h tylko zadeklaruj klase Miecz gdzieś na początku pliku:

class Miecz;

A wszystkie definicje funkcji nalezacych do klasy Wojownik wywal do wojownik.cpp tak jak to zrobiłeś z całą resztą jego funkcji poza `PobierzWartoscAtakuBroni`. natomiast sam #include "Miecz.h" wrzuć tez do wojownik.cpp. Analogicznie zrób dla klasy Miecz. Najlepiej jakby tak to wyglądało wszędzie - deklaracja klasy jeśli potrzebna w *.h, a include w *.cpp.

Dodatkowo masz zupełnie bezsensowny kod w wojownik.cpp:

void Wojownik::Wyswietl()
{
    SprawdzObrazenia();
    cout << "Parametry twojej postaci" << endl;
    cout << "imie : " << imie << endl << "lvl : " << lvl << endl;
    cout << "punkt zycia : " << zdrowie << endl << "punkt energi :" << energia << endl <<
        "sila : " << sila << endl << "atak od broni : " << WartoscAtakuBroni << endl << "obrazenia w walce: " << obrazenia << endl;
    cout << " Nastepny level za  : " << exp << " punktow doswiadczenia " << endl;
}
void Wojownik::SprawdzObrazenia()
{
    obrazenia = sila + WartoscAtakuBroni;
}

W klasie Wojownik nie ma czegoś takiego jak WartoscAtakuBroni, więc...

No i ta funkcja PobierzWartoscAtakuBroni. Nie chodzilo ci przypadkiem o cos takiego:

    int PobierzWartoscAtakuBroni(int sila, const Miecz& miecz)
    {
        return sila + miecz.WartoscAtakuBroni;

    };

lub 

    void PobierzWartoscAtakuBroni(int& obrazenia, int sila, const Miecz& miecz)
    {
        obrazenia = sila + miecz.WartoscAtakuBroni;

    };

? To co jest obecnie nie ma sensu, bo `obrazenia` jest zmienną lokalną o czym już mówiłem.

komentarz 15 sierpnia 2018 przez Krutek Początkujący (330 p.)
Dzięki za odpowiedź! wszystko ruszyło :) i tak o to dokładnie mi chodziło z funkcją Pobierz...

Tylko teraz jeszcze jedno pytanie mam, bo do klasy wojownik jest zaincludowana klasa miecz a gdybym miał więcej takich klas to jest miecz, topór, włócznia i później analogicznie dla maga jakieś rodzaje magicznych lasek to czy mogę wszędzie tam gdzie zainkludowałem miecz zainkludować po prostu klase abstrakcyjną bron ?
komentarz 15 sierpnia 2018 przez criss Mędrzec (172,590 p.)
Jeśli nigdzie w kodzie nie będziesz potrzebował się odwoływać bezpośrednio do klas pochodnych od Bron (wspomniane miecz, topor, wlocznia...), to tak.
komentarz 16 sierpnia 2018 przez Krutek Początkujący (330 p.)
Ok, Jeszcze raz Wielkie Dzięki!
komentarz 16 sierpnia 2018 przez Krutek Początkujący (330 p.)

W sumie to chciałbym zapytać cię o jeszcze jedną rzecz, mianowicie jak wywołać  to

int PobierzWartoscAtakuBroni(int sila, const Miecz& miecz)
{
    return sila + miecz.WartoscAtakuBroni;
 
};

 

komentarz 16 sierpnia 2018 przez criss Mędrzec (172,590 p.)

Jak to jak wywolac? Jak kazdą inną funkcje

PobierzWartoscAtakuBroni(5, Miecz());

 

btw po definicji funkcji nie stawia się średnika

Podobne pytania

0 głosów
1 odpowiedź 243 wizyt
pytanie zadane 23 marca 2021 w Python przez user125 Początkujący (400 p.)
0 głosów
2 odpowiedzi 2,043 wizyt
pytanie zadane 18 marca 2018 w JavaScript przez OdsetekGlupoty Pasjonat (15,360 p.)

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 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!

...