Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] - Obiektowe funkcje nie działają.

Ostatnio zmodyfikowano 2016-12-28 10:11
Autor Wiadomość
pealike
Temat założony przez niniejszego użytkownika
[C++] - Obiektowe funkcje nie działają.
» 2016-12-26 17:22:07
Witam,
Dla czystej frajdy i zrozumienia co nieco obiektówki, zacząłem pisać grę RPG, tekstową. Niespodziewany błąd jednak pojawił się przy zmienianiu atrybutów dla postaci. Stworzyłem funkcję z 4 argumentami i według mnie wszystko powinno działać. Nie wiem o co tu chodzi, wszystko przechodzi zgodnie z planem, lokalne zmienne, lokalny obiekt i zwracanie wartości. Wszystko to jako funkcja dla klasy Bohater. Moje pytanie jest takie: Jak to naprawić, lub jak stworzyć system zamiany atrybutów dla klasy Bohater z innych klas w zależności od wybranej klasy w grze?

main.cpp
C/C++
#include <iostream>
#include "napisy.h"
#include <cstdlib>
#include <stdio.h>

using namespace std;

// zmienne //
int wybor1; int wybor2; int wybor3; int wybor4;
int frame = 0;
// zmienne //

int main()
{
    // obiekty podstawowe //
    Napisy napis;
    Bohater bohater;
    Wojownik wojownik;
    Mag mag;
    Lowca lowca;
    Zlodziej zlodziej;
    // obiekty podstawowe //
    { // gra - menu //
        while( frame == 0 )
        {
            napis.logo();
            napis.menuglowne();
            cin >> wybor3;
            switch( wybor3 )
            {
            case 1: frame = 1; break;
            case 2: frame = 2; break;
            case 3: return 0;
            }
           
        }
    } // gra - menu //
    { // gra - frame 1 (gra)
        while( frame == 1 )
        {
            napis.wyborklasa();
            cin >> wybor4;
            switch( wybor4 )
            {
            case 1: bohater.zmianaklasy1( bohater.hp, bohater.atak, bohater.szybkoscataku, bohater.klasa );
            case 2: bohater.zmianaklasy2( bohater.hp, bohater.atak, bohater.szybkoscataku, bohater.klasa );
            case 3: bohater.zmianaklasy3( bohater.hp, bohater.atak, bohater.szybkoscataku, bohater.klasa );
            case 4: bohater.zmianaklasy4( bohater.hp, bohater.atak, bohater.szybkoscataku, bohater.klasa );
            }
           
            cout << "Teraz malutki test czy zmiana atrybutow dziala." << endl;
            getchar(); getchar();
            bohater.spis();
            getchar(); getchar();
        }
    } // gra - frame 1 (gra)
    { // gra - frame 2 (autor)
        napis.autor();
        getchar(); getchar();
    } // gra - frame 2(autor)
}
Napisy.cpp
C/C++
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include "napisy.h"


using namespace std;
// funkcje klasy "Napisy" //

void Napisy::logo()
{
    system( "cls" );
    system( "COLOR 2" );
    cout << "===========" << endl;
    cout << "||GRA RPG||" << endl;
    cout << "===========" << endl;
}
void Napisy::menuglowne()
{
    cout << "1 - Graj" << endl;
    cout << "2 - Autor" << endl;
    cout << "3 - Wyjdz" << endl;
    cout << "Wybierz: ";
}
void Napisy::autor()
{
    system( "cls" );
    cout << "Autor: Piotr Kuncy" << endl;
    cout << "Wersja: 0.01" << endl;
    cout << "Kliknij dowolny klawisz, by wyjsc..." << endl;
}
void Napisy::wyborklasa()
{
    system( "cls" );
    cout << "Kazdy uczestnik gry powinien miec swoja klase. Wybierz ja." << endl;
    cout << "1 - Wojownik" << endl;
    cout << "2 - Mag" << endl;
    cout << "3 - Lowca" << endl;
    cout << "4 - Zlodziej" << endl;
    cout << "Wybierz: ";
}
// funkcje klasy "Napisy" //


// funkcje klasy "Bohater" //
void Bohater::spis()
{
    system( "cls" );
    cout << "Klasa: " << Bohater::klasa << endl;
    cout << "Zloto: " << Bohater::zloto << endl;
    cout << "HP: " << Bohater::hp << endl;
    cout << "Atak broni: " << Bohater::atak << endl;
    cout << "Bron: " << Bohater::bronz << endl;
}
// funkcje klasy "Bohater" //

// funkcje zmian atrybutow bohatera //
int Bohater::zmianaklasy1( int bohaterhp, int bohateratak, int bohaterszybkoscataku, int bohaterklasa )
{
    Wojownik wojownik;
    bohaterhp = wojownik.hp;
    bohateratak = wojownik.atak;
    bohaterszybkoscataku = wojownik.szybkoscataku;
    bohaterklasa = wojownik.klasa;
    return bohaterhp; return bohateratak; return bohaterszybkoscataku; return bohaterklasa;
}
int Bohater::zmianaklasy2( int bohaterhp, int bohateratak, int bohaterszybkoscataku, int bohaterklasa )
{
    Mag mag;
    bohaterhp = mag.hp;
    bohateratak = mag.atak;
    bohaterszybkoscataku = mag.szybkoscataku;
    bohaterklasa = mag.klasa;
    return bohaterhp; return bohateratak; return bohaterszybkoscataku; return bohaterklasa;
}
int Bohater::zmianaklasy3( int bohaterhp, int bohateratak, int bohaterszybkoscataku, int bohaterklasa )
{
    Lowca low;
    bohaterhp = low.hp;
    bohateratak = low.atak;
    bohaterszybkoscataku = low.szybkoscataku;
    bohaterklasa = low.klasa;
    return bohaterhp; return bohateratak; return bohaterszybkoscataku; return bohaterklasa;
}
int Bohater::zmianaklasy4( int bohaterhp, int bohateratak, int bohaterszybkoscataku, int bohaterklasa )
{
    Zlodziej zlodziej;
    bohaterhp = zlodziej.hp;
    bohateratak = zlodziej.atak;
    bohaterszybkoscataku = zlodziej.szybkoscataku;
    bohaterklasa = zlodziej.klasa;
    return bohaterhp; return bohateratak; return bohaterszybkoscataku; return bohaterklasa;
}
// funkcje zmian atrybutow bohatera //
Napisy.h
C/C++
#include <iostream>

using namespace std;

class Napisy
{
public:
    void logo();
    void menuglowne();
    void autor();
    void wyborklasa();
};

class Bohater
{
public:
    int hp = 0;
    int zloto = 0;
    int atak = 0;
    int klasa = 0;
    int szybkoscataku = 0;
    string klasaz;
    string bronz;
    void spis();
    int zmianaklasy1( int bohaterhp, int bohateratak, int bohaterszybkoscataku, int bohaterklasa );
    int zmianaklasy2( int bohaterhp, int bohateratak, int bohaterszybkoscataku, int bohaterklasa );
    int zmianaklasy3( int bohaterhp, int bohateratak, int bohaterszybkoscataku, int bohaterklasa );
    int zmianaklasy4( int bohaterhp, int bohateratak, int bohaterszybkoscataku, int bohaterklasa );
};

class Wojownik
{
public:
    int hp = 110;
    int klasa = 1;
    int atak = 15;
    int szybkoscataku = 15;
    string klasa1;
};
class Mag
{
public:
    int hp = 70;
    int klasa = 2;
    int atak = 30;
    int szybkoscataku = 35;
    string klasa2;
};
class Lowca
{
public:
    int hp = 90;
    int klasa = 3;
    int atak = 20;
    int szybkoscataku = 35;
    string klasa3;
};
class Zlodziej
{
public:
    int hp = 100;
    int klasa = 4;
    int atak = 20;
    int szybkoscataku = 25;
    string klasa4;
};

P-155454
darko202
» 2016-12-27 08:31:06
1.
  Czy mógłbyś doprecyzować problem ?
masz wszędzie w klasach zmienne publiczne, dlatego nie jest jasne z czym masz problem.

2.
  Logicznym przy obiektowości jest dziedziczenie klas
np.
C/C++
class Lowca
    : public Bohater
{
    ...
};

http://cpp0x.pl/kursy​/Programowanie-obiektowe-C++​/Polimorfizm/Dziedziczenie/494

cytując z tego
"
We wszystkich sposobach dziedziczenia, składowe prywatne klasy bazowej są dziedziczone jako prywatne, ale klasa pochodna nie ma do nich dostępu. Aby klasa pochodna miała dostęp do prywatnych składowych klasy bazowej, musi być zaprzyjaźniona z klasą bazową.
"

itd...
 
P-155504
pealike
Temat założony przez niniejszego użytkownika
Rep
» 2016-12-27 17:38:45
Darko202 - mam problem z tą funkcją "zmianaklasy". Nie mogę tego poprawić, gdyż moim zdaniem wszystko jest okej. Program się włącza normalnie, dopóki nie dochodzi do tej funkcji. Coś tutaj jest nie tak.
P-155543
mateczek
» 2016-12-27 17:51:06
C/C++
int Bohater::zmianaklasy3( int bohaterhp, int bohateratak, int bohaterszybkoscataku, int bohaterklasa ) // parametry lokalne nic nie zmienisz !!!
{
    Lowca low; // po co tworzyć obiekt domyśny z którego nikt nie korzysta??
    bohaterhp = low.hp;
    bohateratak = low.atak;
    bohaterszybkoscataku = low.szybkoscataku;
    bohaterklasa = low.klasa;
    return bohaterhp; //return bohateratak; return bohaterszybkoscataku; return bohaterklasa; // to już totalna sieczka
}
twoja funkcja zwraca "int" wartość zwracana jest jedna!!! Więc resztę można wziąć w komentarz i tak się nie wykona
http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Funkcje-pierwsze-starcie/291
P-155544
pealike
Temat założony przez niniejszego użytkownika
» 2016-12-27 17:58:43
Mateczek - dzięki za przypomnienie co do zwracanej wartości.
Obiekt miał służyć do zmiany wartości argumentu

Edit: No to skoro nie mogę zmieniać zmiennych lokalnych, to jak zrobić, by działało to jak należy? Bo moim zdaniem wpisywanie w argumenty liczb atrybutów klas jest trochę nie przejrzyste.
P-155547
mateczek
» 2016-12-27 18:48:13
Obiekt miał służyć do zmiany wartości argumentu
Sorki ale ja nie bardzo rozumiem co chcesz zrobić ?? te funkcje niczego nie zmienią. Może po tym jak te funkcje wywołujesz można by się czegoś domyślić. Ten kod, przynajmniej mi, nie wiele mówi.
P-155559
pealike
Temat założony przez niniejszego użytkownika
» 2016-12-27 19:15:17
chcę stworzyć funkcję, która zmieniała by atrybuty klasy Bohater (hp, atak, szybkosc ataku) na tą która jest w klasie wybranej przez gracza (wojownik, łowca, złodziej, mag).  jak taką stworzyć? no bo faktycznie z funkcjami to nie wiele robi. czy pozostaje mi tylko w funkcje wpisać ręcznie wartości atrybutów klas(wojownik itd.)?
P-155563
kistel66
» 2016-12-27 19:33:20
Nie wiem, czy dobrze zrozumiałem, ale może coś takiego?

C/C++
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

class Bohater
{
public:
    int zdrowie;
    int zloto;
    void wyswietl()
    {
        cout << "Twoje statystyki: " << endl;
        cout << zdrowie << endl;
        cout << zloto << endl;
    }
};

class Wojownik
    : public Bohater
{
public:
    Wojownik( int hp = 10, int zlot = 10 ) //konstruktor
    {
        zdrowie = hp;
        zloto = zlot;
    }
   
};

class Lucznik
    : public Bohater
{
public:
    Lucznik( int hp = 5, int zlot = 5 )
    {
        zdrowie = hp;
        zloto = zlot;
    }
   
};


int main()
{
    cout << "Wybierz postac: ";
    short wybor;
    cin >> wybor;
    if( wybor == 1 )
    {
        cout << "Wybrales wojownika!" << endl;
        Wojownik w1;
        w1.wyswietl();
    }
    else
    {
        cout << "Wybrales lucznika!" << endl;
        Lucznik l1;
        l1.wyswietl();
    }
    return 0;
}

Nie potrzebnie tworzysz te wszystkie obiekty (Wojownik, Lucznik itp) na samym początku, skoro potem i tak ich nie wykorzystujesz.
P-155567
« 1 » 2
  Strona 1 z 2 Następna strona