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 #include <iostream> #include "napisy.h" #include <cstdlib> #include <stdio.h>
using namespace std;
int wybor1; int wybor2; int wybor3; int wybor4; int frame = 0;
int main() { Napisy napis; Bohater bohater; Wojownik wojownik; Mag mag; Lowca lowca; Zlodziej zlodziej; { 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; } } } { 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(); } } { napis.autor(); getchar(); getchar(); } }
Napisy.cpp #include <iostream> #include <cstdlib> #include <windows.h> #include "napisy.h"
using namespace std;
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: "; }
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; }
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; }
Napisy.h #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; };
|
|
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. class Lowca : public Bohater { ... };
http://cpp0x.pl/kursy/Programowanie-obiektowe-C++/Polimorfizm/Dziedziczenie/494cytują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... |
|
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. |
|
mateczek |
» 2016-12-27 17:51:06 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; }
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 |
|
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. |
|
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. |
|
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.)? |
|
kistel66 |
» 2016-12-27 19:33:20 Nie wiem, czy dobrze zrozumiałem, ale może coś takiego? #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 ) { 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. |
|
« 1 » 2 |