Wyświetlanie i przekazywanie zmiennych [Dziedziczenie i Klasy]

0

Witam mam oto następujący programik:

MAIN.CPP

#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

#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

 
#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ą ?

0

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

1

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

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ę.

1

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

if (a==1)
{
    m.atak(mo);
} 
else if (a==2)
{
    mo.atak(m);
}
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:

 
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:

 
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.

1

Zrób DMG protected

1

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

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.

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1