• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
409 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 (156,320 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 718 wizyt
pytanie zadane 4 kwietnia 2018 w C i C++ przez urbix01 Gaduła (3,290 p.)
0 głosów
0 odpowiedzi 326 wizyt
pytanie zadane 21 lutego 2019 w C# przez jakubjordanek Obywatel (1,340 p.)
0 głosów
3 odpowiedzi 724 wizyt
pytanie zadane 16 czerwca 2015 w C i C++ przez tarnasm Gaduła (3,030 p.)

93,176 zapytań

142,185 odpowiedzi

321,980 komentarzy

62,506 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1637p. - dia-Chann
  2. 1614p. - Łukasz Piwowar
  3. 1599p. - CC PL
  4. 1597p. - Łukasz Eckert
  5. 1537p. - Łukasz Siedlecki
  6. 1531p. - rucin93
  7. 1356p. - ssynowiec
  8. 1351p. - Tomasz Bielak
  9. 1328p. - Michal Drewniak
  10. 1288p. - rafalszastok
  11. 1273p. - Adrian Wieprzkowicz
  12. 1232p. - Mikbac
  13. 1169p. - Grzegorz Aleksander Klementowski
  14. 1155p. - Piotr Aleksandrowicz
  15. 1149p. - Michał Telesz
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...