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

Metody klasy wewnątrz zewnętrznych voidów

Object Storage Arubacloud
0 głosów
209 wizyt
pytanie zadane 19 marca 2017 w C i C++ przez akiihombre Początkujący (250 p.)

Witam!

Chcąc wywołać metodę klasy wewnątrz jednego z voidów, wyskakuje błąd "error: ekranik was not declared in this scope". Nie mam pojęcia jak temu zaradzić. Klasa "Mag" stworzona została za pomocą polimorfizmu. Dodatkowo jej obiekt jest utworzony na starcie, wybieram go za pomocą wskaźnika.

void b_zach()
{
    ekranik("Brama Zachodnia", "Wstajesz z ziemi. Rozgladasz sie. Wyjscie z miasta nigdy jeszcze nie wydawalo Ci sie tak nieznajome. Promienie slonca wschodzacego nad brama przecinaja panujacy polmrok. Staznicy jak zwykle zaspani - nie dziwie im sie.", "Straznik1", "Straznik2", "Zebrak", "Pies");
    cout << "rozmowa, walka, stats" << endl;

    string wybor1;

    cin >> wybor1;

        if(wybor1=="stats") statystyki();
}


class Mag :public Postac
    {

        int zdrowie = 75;
        int mana = 125;
        int sila = 10;
        int zrecznosc = 12;
        int talent_mag = 2;
        int akt_zdrowie = 75;
        int akt_mana = 125;
        int lvl = 1;
        int exp = 0;

    public:

        friend void b_zach();

            string rasa;
            string miejsce;

            Mag(string="Brak", string="Zach. Brama");

            void staty();
            void gdzie(string miejsce);
            void opis(string text);
            void ppl(string p1, string p2, string p3, string p4);
            void ekranik(string where, string mess, string pp1, string pp2, string pp3, string pp4);
            void statystyki();
    };

 

3 odpowiedzi

+2 głosów
odpowiedź 20 marca 2017 przez mokrowski Mędrzec (155,460 p.)

Brniesz w ślepy zaułek.. Tu masz szkic... :

#include <iostream>
#include <vector>
#include <string>

class Postac {
public:
    Postac(const std::string& imie_): imie{imie_} {}
    virtual const std::string& dajNazwe() const = 0;
    virtual void staty() const = 0;
    virtual void gdzie(const std::string& miejsce) = 0;
    const std::string& dajImie() const {
        return imie;
    }
    // .. oraz inne funkcje wirtualne.. 
    virtual ~Postac() {}
protected:
    std::string imie;
    std::string rodzaj;
    std::string miejsce;
};

class Mag: public Postac {
public:
    Mag(const std::string& imie_): Postac{imie_} {
        rodzaj = "Mag";
    }
    const std::string& dajNazwe() const override {
        return rodzaj;
    }
    void staty() const override {
        std::cout << "Jakieś staty z Mag'a. Mag jest w miejscu: "
            << miejsce << '\n';
    }
    void gdzie(const std::string& miejsce_) override {
        miejsce = miejsce_;
    }
};

class Zlodziej: public Postac {
public:
    Zlodziej(const std::string& imie_): Postac{imie_} {
        rodzaj = "Złodziej";
    }
    const std::string& dajNazwe() const override {
        return rodzaj;
    }
    void staty() const override {
        std::cout << "Jakieś staty ze Złodzieja. Złodziej jest w miejscu: "
            << miejsce << '\n';
    }
    void gdzie(const std::string& miejsce_) override {
        miejsce = miejsce_;
    }
};

// XXX: Raczej powinno być nazwa Lokacja lub coś w tym stylu.. 
class Ekranik {
public:
    Ekranik(const std::string& opis_): opis{opis_} {}
    void dodajPostac(const Postac * postac_) {
        postacie.push_back(postac_);
    }
    void dodajPostacie(const std::vector<Postac *>& postacie_) {
        for(const auto& p: postacie_) {
            postacie.push_back(p);
        }
    }
    void wyswietl() const {
        std::cout << "Ekran: " << opis << '\n'
            << "Widzisz: ";
        // XXX: Wywołanie polimorficzne dajNazwe() 
        for(const auto& postac: postacie) {
            std::cout << postac->dajNazwe() << " "
                << " o imieniu " << postac->dajImie() << "| ";
        }
        std::cout << '\n';
    }
    // XXX: Nie robię destruktora bo Ekranik nie zajmuje się obsługą 
    // cyklu życia postaci...
private:
    std::vector<const Postac*> postacie;
    std::string opis;
};

int main() {
    auto m1 = Mag("Anzelm");
    auto m2 = Mag("Nubis");
    auto z1 = Zlodziej("Qurs");
    auto z2 = Zlodziej("Zeqir");
    auto e = Ekranik("Gospoda");

    Postac * postacie[] = {&m1, &z1, &m2, &z2};
    for(auto& p: postacie) {
        e.dodajPostac(p);
    }

    e.wyswietl();
}

 

0 głosów
odpowiedź 19 marca 2017 przez C☺ndzi Stary wyjadacz (12,100 p.)
Chyba ekranik() przyjmuje inną liczbę argumentów. Jest ich tyle że gubię się w liczeniu :P

@edit

Nie zauważyłem, że to jest funkcja - musisz jeszcze przekazać wskaźnik / referencję na obiekt klasy Mag i na nim operować (to w argumencie -> Mag& mag; potem: mag.ekranik(twojeDane))
komentarz 19 marca 2017 przez akiihombre Początkujący (250 p.)

Tylko, że klas mam 4. Na początku gry wybierana jest klasa postaci. Tam za pomocą switcha zmieniam wskaźnik na jeden z utworzonych wcześniej obiektów. Wygląda to mnie więcej tak:


Mag mg("Mag");
Lucznik lk("Lucznik");
Tank tk("Tank");
Dps wk("Wojownik");

Postac *kto;

Potem w switchu w zależności od wyboru ustawiam wskaźnik. np:

kto = &mg;

Nie da się tego zrobić od razu dla wszystkich obiektów? Czy muszę za cztery razy razy tworzyć funkcję dla każdej klasy osobno?

komentarz 20 marca 2017 przez C☺ndzi Stary wyjadacz (12,100 p.)
Tak byłoby najprościej. Ale dlaczego nie dasz tej metody jako wirtualnej w każdej klasie? Potem po prostu wywoływałbyś kto->taMetoda()
0 głosów
odpowiedź 20 marca 2017 przez Dexterim Dyskutant (8,370 p.)
Spróbuj dać deklaracje przyjaźni poniżej deklaracji funkcji ekranik

Podobne pytania

0 głosów
4 odpowiedzi 600 wizyt
pytanie zadane 4 kwietnia 2018 w C i C++ przez urbix01 Gaduła (3,290 p.)
0 głosów
0 odpowiedzi 189 wizyt
pytanie zadane 21 lutego 2019 w C# przez jakubjordanek Obywatel (1,320 p.)
0 głosów
3 odpowiedzi 441 wizyt
pytanie zadane 16 czerwca 2015 w C i C++ przez tarnasm Gaduła (3,030 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...