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

question-closed Metoda nie znajduje atrybutu typu wskaźnikowego

Object Storage Arubacloud
0 głosów
123 wizyt
pytanie zadane 7 stycznia 2021 w C i C++ przez AnimPony Początkujący (440 p.)
zamknięte 8 stycznia 2021 przez AnimPony

Cześć,

chciałem napisać prostą symulację walki turowej za pomocą obiektowego języka C++. Jednakże przy samej próbie utworzenia obiektów wyskakują błędy, szukałem w google przykładów, jak to naprawić, niestety nie znalazłem nic, co mogłoby pomóc w moim przypadku. Czy jakaś dobra dusza mogłaby mi objaśnić czemu program nie może znaleźć "Wojownik' w metodzie spell(Wojownik*)?

main:

#include <iostream>
#include <Windows.h>
#include <time.h>
#include "Header.h"

using namespace std;

int main() {
	srand(time(NULL));

	Wojownik* woj1 = new Wojownik;
	woj1->pokaz();

	Mag* mag1 = new Mag;
	mag1->show();


	
	return 0;
}

header:

#include <iostream>
#include <Windows.h>
#include <time.h>

using namespace std;

//----------Klasy---------

class Wojownik {
public:
	string imie;
	int hp;
	int sila;
	Wojownik(string = "Mieszko", int = 100, int = 10);
	void pokaz();
	bool uderz(Mag*);
};

class Mag {
public:
	string name;
	int hp;
	int power;
	int mana;
	Mag(string = "Lucyfer", int = 50, int = 25, int = 50);
	void show();
	bool spell(Wojownik*);
};

.cpp:

#include "Header.h"

//----------Metody dla Wojownika-----------

Wojownik::Wojownik(string i, int h, int s) {
	this->imie = i;
	this->hp = h;
	this->sila = s;
}

void Wojownik::pokaz() {
	cout << "Wojownik " << this->imie << " posiada " << this->hp << " punktow zycia" << endl;
}

bool Wojownik::uderz(Mag* przeciwnik) {
	Sleep(3000);
	int obr = this->sila + (rand() % 11);
	cout << "Wojownik " << this->imie << " uderza maga " << przeciwnik->name << " za " << obr << " punktow obrazen" << endl;
	przeciwnik->hp -= obr;
	if (przeciwnik->hp <= 0) return true;
	else return false;
}

//-------------Metody dla Maga---------------

Mag::Mag(string n, int h, int p, int m) {
	this->name = n;
	this->hp = h;
	this->power = p;
	this->mana = m;
}

void Mag::show() {
	cout << "Mag " << this->name << " posiada " << this->hp << " punktow zdrowia" << endl;
}

bool Mag::spell(Wojownik* target) {
	Sleep(3000);
	int dmg = this->power + (rand() % 21);
	cout << "Mag " << this->name << " uderza wojownika " << target->imie << " za " << dmg << " punktow obrazen";
	target->hp -= dmg;
	if (target->hp <= 0) return true;
	else return false;
}

błędy:

komentarz zamknięcia: otrzymałem odpowiedz
komentarz 7 stycznia 2021 przez j23 Mędrzec (194,920 p.)
    if (przeciwnik->hp <= 0) return true;
    else return false;

Wystarczy tak:

return przeciwnik->hp <= 0;

 

Po co dajesz this przy każdym wywołaniu metody? To nic nie daje poza mniejszą czytelnością.

2 odpowiedzi

+1 głos
odpowiedź 7 stycznia 2021 przez tangarr Mędrzec (154,780 p.)
wybrane 7 stycznia 2021 przez AnimPony
 
Najlepsza

Program "nie może znaleźć" klasy Mag w funkcji Wojownik::Uderz ponieważ, klasa Mag jest zdefiniowana po klasie Wojownik.

Wystarczy, żebyś poinformował program, że gdzieś dalej w kodzie zostanie zdefiniowana klasa Mag.

#include <iostream>
#include <Windows.h>
#include <time.h>
 
using namespace std;

// Deklaracja klasy Mag
class Mag;
 
//----------Klasy---------
 
class Wojownik {
public:
    string imie;
    int hp;
    int sila;
    Wojownik(string = "Mieszko", int = 100, int = 10);
    void pokaz();
    bool uderz(Mag*);
};
 
// definicja klasy Mag
class Mag {
public:
    string name;
    int hp;
    int power;
    int mana;
    Mag(string = "Lucyfer", int = 50, int = 25, int = 50);
    void show();
    bool spell(Wojownik*);
};

 

komentarz 7 stycznia 2021 przez j23 Mędrzec (194,920 p.)

Dodatkowo zamiast <Windows.h> daj <string>.

+1 głos
odpowiedź 7 stycznia 2021 przez adrian17 Ekspert (344,860 p.)

Patrz na błędy od góry. Pierwszy jest tutaj:

    bool uderz(Mag*);

i faktycznie nad tą linią nie ma żadnej deklaracji klasy Mag.

Dodaj samą deklarację klas nad tymi dwiema klasami i będzie lepiej :)

3
komentarz 7 stycznia 2021 przez Oscar Nałogowiec (29,290 p.)

Można też zapisać argument jako class Mag *.

Podobne pytania

+1 głos
1 odpowiedź 237 wizyt
pytanie zadane 25 września 2018 w Java przez BuxBleed Użytkownik (810 p.)
+1 głos
3 odpowiedzi 372 wizyt
pytanie zadane 9 lutego 2021 w C i C++ przez Kacperek_code Obywatel (1,690 p.)
0 głosów
0 odpowiedzi 125 wizyt
pytanie zadane 25 maja 2019 w C i C++ przez adus Nowicjusz (120 p.)

92,552 zapytań

141,400 odpowiedzi

319,531 komentarzy

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

...