• 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

VPS Starter Arubacloud
0 głosów
257 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 (344,100 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 (344,100 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 (344,100 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 (344,100 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,590 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,269 wizyt
pytanie zadane 8 lutego 2018 w C i C++ przez Leon307 Początkujący (270 p.)
+1 głos
0 odpowiedzi 2,967 wizyt
0 głosów
1 odpowiedź 385 wizyt

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...