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

Funkcja zaprzyjaźniona z polimorficznym wskaźnikiem

Cloud VPS
0 głosów
566 wizyt
pytanie zadane 29 lipca 2018 w C i C++ przez Krutek Początkujący (330 p.)
edycja 29 lipca 2018 przez Krutek

Cześć!

Próbuję napisać coś w rodzaju systemu walki między dwoma postaciami,

void walka(Postac &wsk1, Postac &wsk2)
{

	int k;
	cout << "rozpoczyna sie walka miedzy : " << endl;
	wsk1.wyswietl();
	cout << " a : " << endl;
	wsk2.wyswietl();
	
	wsk1.hp - wsk2.obrazenia;
}
#pragma once

#include <iostream>
#include <string>
using namespace std;
class Postac
{
private:
	string imie;
	int lvl, hp, energia, sila, bron, obrazenia,exp;

public:
	Postac();
	virtual ~Postac();
	virtual void obrazenia1()=0;
	virtual void wyswietl() = 0;
	virtual void level() = 0;
	virtual void getexp()=0;
	virtual void atak1()=0;
	virtual void podnieshp()=0;
	virtual void podniessile()=0;
	virtual void podniesenergie()=0;
	virtual void s1()=0;
	virtual void s1o() = 0;
	virtual void s2()=0;
	virtual void hpn()=0;
	friend void walka(Postac &wsk1, Postac &wsk2);
};

Problem pojawia się gdy chce by dwa obiekty działały na siebię to znaczy żeby pobrać ilość punktów hp od jednego obiektu i odjąć o ilość punktów ataku z drugiego, próbowałem wielu różnych zapisów ale za każdym razem gdy używam metody wyswietl(); obiekt zostaje taki sam jak był a gdy spróbuję wyświetlić pojedyńczą wartość z danego obiektu np  cout<<wsk2.hp; to pokazuje mi dużo randomowych cyferek tak samo jak postawie przed wsk ampersanda. Proszę o wytłumaczenie o co tu chodzi coś w rodzaju interpretacji kodu oraz jak rozwiązać ten problem, jeżeli ktoś ma inny pomysł jak zrobić taki system walki na kształt turowej to chętnie przeczytam.

Dziękuje

int main()
{
	

	wojownik woj1;
	wojownik *wsk1;
	wsk1 = &woj1;
	 
	wojownik woj2("artur",3,30,30,10,20,0,50);
	wojownik *wsk2;
	wsk2 = &woj2;

	walka(woj1,woj2);
	wsk1->wyswietl();
	
	
		system("pause");
    return 0;
}

oraz plik wojownik.cpp

#include "stdafx.h"
#include "wojownik.h"


wojownik::wojownik(string imie,int lvl,int hp,int energia, int sila, int bron, int obrazenia,int exp):Postac()
{
	this->imie = imie;
	this->lvl=lvl;
	this->hp = hp;
	this->energia = energia;
	this->sila = sila;
	this->bron = bron;
	this->obrazenia = obrazenia;
	this->exp = exp;

}
wojownik::~wojownik()
{
}

void wojownik::wyswietl()
{
	obrazenia1();
	cout << "Parametry twojej postaci" << endl;
	cout << "imie : " << imie << endl << "lvl : " << lvl << endl;
	cout << "punkt zycia : "<< hp << endl<<"punkt energi :" << energia << endl <<
		"sila : " <<sila << endl <<"atak od broni : " <<bron << endl<< "obrazenia w walce: " << obrazenia << endl;
	cout <<  " Nastepny level za  : " << exp << " punktow doswiadczenia " << endl;
}
void wojownik::obrazenia1()
{
	obrazenia = sila + bron;
}
void wojownik::atak1()
{

}
void wojownik::level()
{
	

	if (exp >= 100)
	{
		int punktyr = 5;
		cout << "wlasnie awansowales na " << ++lvl << "level! " << endl;
		cout << " Teraz mozesz podniesc swoje statystki  : " << endl;
		


		for (int i = 0; i<= 4; i++)
		{
			
			int wyborparametru;
			
			cout << " masz do dyspozycji :" << punktyr << " punktow do rozdania " << endl;
			cout << "jaki parametr chcesz podniesc? : 1-hp,     2-energia,      3-sila,  " << endl;
			cin >> wyborparametru;
			switch (wyborparametru)
			{
			case 1:
				podnieshp();
				break;
			case 2:
				podniesenergie();
				break;
			case 3:
				podniessile();
				break;
			}
			--punktyr;
			
			
			}
		exp = exp - 100;
		wyswietl();
	}
	else
		cout << "coraz blizej nowego poziomu!" << endl;


}
void wojownik::hpn()
{
	hp;
}

void wojownik::getexp()
{
	exp = exp + 20;
}
void wojownik::podnieshp()
{
	hp = hp + 2;
}
void wojownik::podniesenergie()
{
	energia = energia + 2;
}
void wojownik::podniessile()
{
	sila = sila + 2;
}

void wojownik::s1()
{
	
	obrazenia = obrazenia + 10;
	cout << "postac "<<imie<<"podnosi swoj atak o : " << obrazenia;
}

void wojownik::s1o()
{
	obrazenia = obrazenia - 10;
	cout << "opadasz z sil" << obrazenia;
}

void wojownik::s2()
{
	hp = hp - obrazenia;
}


 

komentarz 29 lipca 2018 przez adrian17 Mentor (354,120 p.)
(Mógłbyś pokazać pełniejszy kod, w którym używasz tą klasę?)
komentarz 29 lipca 2018 przez Krutek Początkujący (330 p.)
Proszę oto cała funkcja main oraz do tego jeżeli miałoby to być potrzebnę klasa pochodna od abstrakcyjnej
komentarz 29 lipca 2018 przez adrian17 Mentor (354,120 p.)
Mógłbyś gdzieś (gist? jeśli nie umiesz jeszcze używać GitHuba) wrzucić *cały* kod? Niektóre rzeczy wyglądają tu podejrzanie, ale nie potwierdzę tego bez zobaczenia pozostałych nagłówków.
komentarz 29 lipca 2018 przez Krutek Początkujący (330 p.)
W zasadzie to cały kod wstawiłem już tu do pytania, od klasy abstrakcyjnej jest klasa pochodna mag ale w niej nic nie ma jeszcze ,

https://codepen.io/krutek/pen/yqPEQp

Wstawiłem tu cały kod wiem chałupnictwo pełną parą

Z lewej strony w sekcji html jest plik główny czyli main i ten void w sekcji css wszystkie pliki z rozszerzeniem .h no i w  js jest wojownik.cpp
komentarz 29 lipca 2018 przez adrian17 Mentor (354,120 p.)
wojownik.h też poproszę...

I nie wrzucaj w strony do testowania HTMLa, tylko prędzej uniwersalny https://gist.github.com/
komentarz 29 lipca 2018 przez Krutek Początkujący (330 p.)

1 odpowiedź

0 głosów
odpowiedź 29 lipca 2018 przez adrian17 Mentor (354,120 p.)

No, to sprawa wyjaśniona.

Problem nie ma związku z funkcjami zaprzyjaźnionymi i wskaźnikami, tylko z podstawowym dziedziczeniem klas.

class Postac
{
private:
	string imie;
	int lvl, hp, energia, sila, bron, obrazenia,exp;
class wojownik : public Postac
{
public:
	string imie;
	int lvl, hp, energia,sila,bron,obrazenia,exp;

Klasa `Wojownik` ma teraz dwie kopie każdego pola. Jedno `imie` dziedziczone od klasy `Postac` (ale niedostępne dla niego, bo prywatne) i jedno niezależnie zdefiniowane `imie` w klasie `Wojownik`.

Niektóre funkcje, metody i konstruktory odnoszą się do jednego pola, drugie do innego. Niektórych pewnie w ogóle nie inicjalizujesz, stąd

gdy spróbuję wyświetlić pojedyńczą wartość z danego obiektu np  cout<<wsk2.hp; to pokazuje mi dużo randomowych cyferek

Proponuję jeszcze raz poczytać o podstawach dziedziczenia (i co robi private/protected/public), zanim zabierzesz się za metody wirtualne.

komentarz 29 lipca 2018 przez Krutek Początkujący (330 p.)

Jeżeli dobrze zrozumiałem to wystarczy zmienić w klasie postac z private na public

jeśli tak to dalej nie działa frown chyba że coś źle zrozumiałem

komentarz 29 lipca 2018 przez criss Mędrzec (172,570 p.)
I wyrzucić z klasy wojownik te wszystkie pola które już masz w klasie Postac.

A zamiast public, wystarczy protected.
komentarz 29 lipca 2018 przez Krutek Początkujący (330 p.)
O Pomogło! mega wielkie dzięki bo sam bym szukał problemu w innym miejscu

Podobne pytania

0 głosów
2 odpowiedzi 1,621 wizyt
pytanie zadane 8 lutego 2018 w C i C++ przez Leon307 Początkujący (270 p.)
+1 głos
0 odpowiedzi 3,280 wizyt
0 głosów
1 odpowiedź 543 wizyt

93,460 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,838 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

Kursy INF.02 i INF.03
...