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, botów: 0