Wyświetlanie i przekazywanie zmiennych [Dziedziczenie i Klasy]

Wyświetlanie i przekazywanie zmiennych [Dziedziczenie i Klasy]
Realmarecz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 39
0

Witam mam oto następujący programik:

MAIN.CPP

Kopiuj
#include "stdafx.h"
#include <iostream>
#include "Postacie.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int a;

	Mag m;
	MagOgnia mo;

	m.show();
	cout << endl << endl;
	mo.show();

			cout << endl << "Kto ma atakowac ? [1/2]: ";
			cin >> a;

			if (a==1){

				m.atak();

			}else if(a==2){

				mo.atak();

			}

	return 0;
}

POSTACIE.H

Kopiuj
#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

class Mag
{
private:
	int HP;
	float DMG;
public:
	string NAME;
	Mag(string KNAME="Mag", int KHP=500, float KDMG=50)
	{
		NAME=KNAME;
		HP=KHP;
		DMG=KDMG;
	}
	void show();
	int atak();
};

class MagOgnia :public Mag
{
private:
	float MAGDMG;
public:
	MagOgnia(string KNAME="MagOgnia", int KHP=350, float KDMG=70, float KMAGDMG=90)
		:Mag(KNAME, KHP, KDMG)
	{
		MAGDMG = KMAGDMG;
	} 

	void show();
	int atak();
};

POSTACIE.CPP

Kopiuj
 
#include "stdafx.h"
#include <iostream>
#include <string>
#include "Postacie.h"

using namespace std;

void Mag::show()
{
	cout << "Nazwa Mag: " << NAME << endl;
	cout << "HP: " << HP << endl;
	cout << "DMG: " << DMG << endl;
}

int Mag::atak()
{
	cout << "Zadaje: " << DMG << " obrazen do " << MagOgnia::NAME;  // Jak tu wyświetlić nazwe MagOgnia z klasy MagOgnia? 

}

void MagOgnia::show()
{
	Mag::show();
	cout << "ATAKDMG: " << MAGDMG << endl;
}

int MagOgnia::atak()
{
	cout << "Zadaje: " << MAGDMG << " obrazen do " << Mag::NAME << endl; // Jak tu wyświetlić nazwe Mag z klasy Mag?
}

A potem bym chciał by wartość DMG odjęła się od HP danego Maga. Nie wiem w jaki sposób to wykonać czy w Main ? Czy metoda przekazywać zmienne, wskaźnik, referencja przez maina ? Czy jakoś między klasami, a może muszę metodę przekazującą ?

patryj1083
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 102
0

Spróbuj z klasą lub funkcją zaprzyjaźnioną.

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1

Niech metoda attack() (primo: nie mieszać angielskiego i polskiego, secundo: nazwy metod zazwyczaj są czasownikami, bo coś robią) przyjmuje parametr, kogo atakuje.

Kopiuj
class Mage
{
    ....
    void attack(Mage& enemy)
    {
        cout << "Inflict: " << DMG << " dmg " << enemy.NAME << endl;
        enemy.reduceHealth(DMG);
    }

    void reduceHealth(int dmg)
    {
        hp -= dmg;
    }
};

W tym przypadku metoda reduceHealth() nie jest konieczna, bo można bezpośrednio zmniejszać hp, ale pomaga zrozumieć logikę.

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1

Wtedy w Main w m.attack(); jak i mo.attack(); Mam że za dużo argumentów w wywołaniu funkcji.

Kopiuj
if (a==1)
{
    m.atak(mo);
} 
else if (a==2)
{
    mo.atak(m);
}
Realmarecz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 39
0

Napisze już w tym temacie, wykonałem według twoich zaleceń a nawet zrobiłem jedna metodę reduceHealth dla klas głównej i chciałem ją też wywołać w obiekcie dziedziczonym Mag Ognia:

Tak zrobiłem i działa super, pobawiłem się na różne sposoby i zrozumiałem:

Kopiuj
 
void Mag::attack(MagOgnia& name)
{
	cout << "Zadaje: " << DMG << " obrazen do " << name.NAME;  // Jak tu wyświetlić nazwe MagOgnia z klasy MagOgnia? 
	name.reduceHealth(DMG);
}

void Mag::reduceHealth(int dmg)
{
		HP -= dmg;
}

Ale teraz wykorzystując metode reduceHealth z klasy głównej:

Kopiuj
 
void MagOgnia::attack(Mag& name)
{
	cout << "Zadaje: " << MAGDMG << " obrazen do " << name.NAME << endl; 
	name.reduceHealth(DMG);
}

// DMG jest inaccessible bo jest prywatny w jaki sposób to zrobić by działało, mogę zrobić jakoś by działało ale chciałbym wiedzieć jak powinno to wyglądać z zachowaniem DMG jako private.

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1

Zrób DMG protected

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1

W ogóle to źle to robisz, a ja przez niedopatrzenie zapomniałem o tym wspomnieć.

Kopiuj
void MagOgnia::attack(Mag& name)
{
    cout << "Zadaje: " << MAGDMG << " obrazen do " << name.NAME << endl; 
    name.reduceHealth(DMG);
}

Tego ma NIE być.

MagOgnia dziedziczy attack() z Mag i to mu wystarcza. Oczywiście metoda musi być protected. Wtedy DMG nawet nie musi być protected, wystarczy private.

Kopiuj
void Mag::attack(Mag& name)
{
    cout << "Zadaje: " << DMG << " obrazen do " << name.NAME;  // Jak tu wyświetlić nazwe MagOgnia z klasy MagOgnia? 
    name.reduceHealth(DMG);
}

Zwróc uwagę, że parametrem jest Mag&, nie MagOgnia&, dzięki czemu można atakować zarówno pierwszego jak i drugiego.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.