Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem przy metodzie, która modyfikuje atrybut należący do innej klasy. "function does not take 1 arguments" oraz "overloaded member function not found"

Ostatnio zmodyfikowano 2017-04-06 22:11
Autor Wiadomość
MadMax0
Temat założony przez niniejszego użytkownika
Problem przy metodzie, która modyfikuje atrybut należący do innej klasy. "function does not take 1 arguments" oraz "overloaded member function not found"
» 2017-04-06 21:16:54
Witam serdecznie,

postanowiłem napisać swój pierwszy program obiektowy. Posiada on dwie klas: Bohater oraz Potwor. Posiadają one po kilka atrybutów oraz funkcję atak, która w założeniu ma modyfikować atrybut należący do klasy przeciwnika (metoda bohatera ma modyfikować HP potwora i na odwrót). Napisałem coś takiego:

C/C++
class Bohater
{
public:
    int sila;
    string nazwa;
    Bohater( string, int, int ); //konstruktor
    int HP;
    void atak( Potwor * );
    void unik();
};

class Potwor
{
public:
    int sila;
    string nazwa;
    Potwor( string, int, int ); //konstruktor
    int HP;
    void atak( Bohater * );
};

Bohater::Bohater( string n, int zycie, int s )
{
    nazwa = n;
    sila = s;
    HP = zycie;
}

void Bohater::atak( Potwor * mob )
{
    int wartoscAtaku = 5;
    ( * mob ).HP =( * mob ).HP - wartoscAtaku;
}

Potwor::Potwor( string n, int zycie, int s )
{
    nazwa = n;
    sila = s;
    HP = zycie;
}

void Potwor::atak( Bohater * heros )
{
    int wartoscAtaku = 1;
    ( * heros ).HP =( * heros ).HP - wartoscAtaku;
}

int main()
{
    int akcja;
    Bohater wojownik( "Piotr", 100, 5 );
    Potwor troll( "Shrek", 20, 1 );
    cout << "Spotkales na swojej drodze potwora! " << endl;
    while( troll.HP != 0 )
    {
        cout << "Czy chcesz go zaatakowac? Wcisnij 1" << endl;
        cin.clear();
        cin.sync();
        cin >> akcja;
        if( akcja == 1 )
        {
            wojownik.atak( & troll );
            cout << "zaatakowales trolla! Jego zycie teraz wynosi " << troll.HP << endl;
        }
       
    }
    cout << "Pokonales go! ";
    system( "Pause" );
}

Niestety otrzymuję następujące błędy:
1. 'Bohater::atak' : function does not take 1 argument
2. 'void Bohater::atak(Potwor *)' : overloaded member function not found in 'Bohater'
3. syntax error : identifier 'Potwor'

AD 1: Przecież wyraźnie przy definicji funkcji napisałem, że przyjmuje jeden argument, a konkretnie wskaźnik do obiektu klasy Potwor.

AD 2 i 3 - nie mam pojęcia jak to rozgryść :/

Czy ktoś mógłby mi pomóc?

P-159916
michal11
» 2017-04-06 21:51:23
Można powiedzieć, że program jest kompilowany od góry, dlatego skąd kompilator ma widzieć co to jest Potwór kiedy próbuje skompilować klasę Bohater? Dodaj deklarację wyprzedzającą klasy Potwór i powinno działać, aczkolwiek taka cykliczna zależność nie zwiastuje niczego dobrego i moim zdaniem powinieneś mieć jedną wspólną klasę jakiegoś typu np.
C/C++
class AttackingCharacter
{
    virtual void Attack( AttackingCharacter & OtherCharacter ) = 0;
}

i zaimplementować ją odpowiednio w swoich klasach.
P-159918
MadMax0
Temat założony przez niniejszego użytkownika
» 2017-04-06 22:11:12
Hej :)
Właśnie chciałem pisać, że problem został rozwiązany z pomocą osób trzecich. Wystarczyło wstępnie zadeklarować klasę Potwor przed klasą Bohater. Niemniej, masz rację, że to raczej nieeleganckie rozwiązanie. Będę starał się ulepszać program!

Dziękuję za pomoc
P-159921
« 1 »
  Strona 1 z 1