• 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

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
154 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 Ekspert (327,560 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 Ekspert (327,560 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 Ekspert (327,560 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 Ekspert (327,560 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,640 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,010 wizyt
pytanie zadane 8 lutego 2018 w C i C++ przez Leon307 Początkujący (270 p.)
+1 głos
0 odpowiedzi 2,631 wizyt
0 głosów
1 odpowiedź 259 wizyt

90,303 zapytań

138,899 odpowiedzi

311,089 komentarzy

60,019 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...