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
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: class Bohater { public: int sila; string nazwa; Bohater( string, int, int ); int HP; void atak( Potwor * ); void unik(); };
class Potwor { public: int sila; string nazwa; Potwor( string, int, int ); 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? |
|
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. class AttackingCharacter { virtual void Attack( AttackingCharacter & OtherCharacter ) = 0; }
i zaimplementować ją odpowiednio w swoich klasach. |
|
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 |
|
« 1 » |