logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C++] Błędy w kodzie C++ przy tworzeniu klasy rycerza - konwersja string na char

Szeregowy Maliniak 15 Mar 2010 16:17 2716 12
REKLAMA
  • #1 7832858
    Szeregowy Maliniak
    Poziom 11  
    Posty: 36
    Ocena: 6
    Chce zrobić coś al'a to http://www.youtube.com/watch?v=rJeY-iJZy1w&feature=related . Poruszanie (na WASD szukałem coś na temat strzałek ale mi nie wychodziło) już działa, zrobiłem na razie prostą klase rycerza i teraz Visual pokazuje mi parę błędów których znaczenia nie rozumiem. Oto kody:
    rycerz.h
    #include <iostream>
    #include <string>
    using namespace std;
    
    
    class rycerz
      {
      private:
        string nick;
        int zloto;
        int hp;
      public:
    	  rycerz():zloto(400),hp(10) {}
        void setNick(string n)
        {
          nick = n; 
        }
        char getNick()
        {
    		return nick;
        }
        int getHp()
        {
          return hp;
        }
        void addHp(int x) 
        {
          hp+=x;
        }
        int getZloto()
        {
          return zloto;
        }
        void addZloto(int x) 
        {
          zloto+=x;
        }
      };


    ruszanie.h
    #include <iostream>
    #include <windows.h>
    #include <time.h>
    #include <string>
    #include <conio.h>
    #include "rycerz.h"
    using namespace std;
    void plansza();
    void ruszanie(int & x,int & y, rycerz soldier);
    void gotoxy(int  x, int  y)
    {
        COORD cord;
        cord.X = x;
        cord.Y = y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cord);
    }
    
    void ruszanie(int & x,int & y , rycerz soldier)
    {
    	
    	cout<<soldier.getNick()<<"\thp="<<soldier.getHp()<<"\tzloto="<<soldier.getZloto()<<endl;
    	cout<<endl;
    	cout<<"----------------------------------------------------------------\n";
    	cout<<endl;
    	int tempx=x,tempy=y;
    	char q,b=4;
    	q = getch();
    	cout<<"\b ";
    	gotoxy(0,0);
    	plansza();
    	if(q=='w')
    	{
    		y-=1;
    		gotoxy(x,y);
    		cout<<b;
    	}
    	if(q=='a')
    	{
    		x-=1;
    		gotoxy(x,y);
    		cout<<b;
    	}
    	if(q=='s')
    	{
    		y+=1;
    		gotoxy(x,y);
    		cout<<b;
    	}
    	if(q=='d')
    	{
    		x+=1;
    		gotoxy(x,y);
    		cout<<b;
    	}
    	
    	if (q!='w'&& q!='a'&& q!='s'&& q!='d')
    	{
    		cout<<"\a";
    	}
    	if(x<=0||y<=0||x>27||y>12)
    	{
    		cout<<"\a";
    		x=tempx;
    		y=tempy;
    		cout<<"\b ";
    		gotoxy(x,y);
    		cout<<b;
    	}
    	
    }
    void plansza()
    {
    	cout<<"|--------------------------|\n";
    	cout<<"|                          |\n";
    	cout<<"|                          |\n";
    	cout<<"|                          |\n";
    	cout<<"|                          |\n";
    	cout<<"|                          |\n";
    	cout<<"|                          |\n";
    	cout<<"|                          |\n";
    	cout<<"|                          |\n";
    	cout<<"|                          |\n";
    	cout<<"|                          |\n";
    	cout<<"|                          |\n";
    	cout<<"|--------------------------|\n";
    
    }


    Gra //główny plik
    #include <iostream>
    #include <string>
    #include <conio.h>
    #include "ruszanie.h"
    #include "rycerz.h"
    void c() {system("cls");}; //czyszczenie ekranu
    using namespace std;
    int main() 
    {
    	rycerz soldier;
    	int x=7,y=7;
    	string n;
    	cout<<"Podaj swoj nick:\n";
    	cin.getline(n,30);
    	soldier.setNick(n);
    	c();
    	
    	for(int q = 0;q<100;q++)
    		ruszanie(x,y,soldier);
    	
    	
    getchar();
    getchar();
    return 0;
    }



    A oto błędy
    [C++] Błędy w kodzie C++ przy tworzeniu klasy rycerza - konwersja string na char
  • REKLAMA
  • Pomocny post
    #2 7833211
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    1. nick masz w stringu, a próbujesz funkcją zwracac znak - niekompatybilne typy.

    Część błędów prawdopodobnie będzie zależna od możliwości skompilowania klasy.
  • #3 7833282
    Szeregowy Maliniak
    Poziom 11  
    Posty: 36
    Ocena: 6
    Jak zmieniłem return na cout<< (w ruszaniu też) to mi teraz wywala błędy z getch()
  • REKLAMA
  • #4 7833486
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    A jakie?

    Tak w ogóle to nie musisz od razu zmieniać na wypisywanie - wystarczy tylko zmienić typ zwracanej wartości przez funkcję.
  • #5 7834175
    Szeregowy Maliniak
    Poziom 11  
    Posty: 36
    Ocena: 6
    [C++] Błędy w kodzie C++ przy tworzeniu klasy rycerza - konwersja string na char
    Jak zmienić typ zwracanej zmiennej na tablice??
  • Pomocny post
    #6 7834432
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    Co do redefinicji - z obu plików nagłówkowych masz wskazanie do pliku zawierającego klasę "rycerz". Domyślam się, że tu będzie tkwił problem.

    Co do tablic - zwraca się wskaźnik na tablicę. Ale jeśli tablica jest tworzona w instancji funkcji - trzeba operować parametrami preferencyjnie przekazanymi.
  • REKLAMA
  • #7 7848159
    Szeregowy Maliniak
    Poziom 11  
    Posty: 36
    Ocena: 6
    Proszę, powiedzcie mi co mam źle. Najbardziej zastanawia mnie ten błąd
    error C2011: 'rycerz' : 'class' type redefinition

    Myślę, że tak jak mówi Dżyszla jeżeli klasa będzie dobrze zrobiona, to reszta powinna działać.
  • Pomocny post
    #8 7848381
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    Jak wspominałem - chodzi tu zapewne o includowanie w pliku includowanym. Wrzuć wszystko do jednego pliku, a pewnie tego błędu się pozbędziesz.
  • REKLAMA
  • #9 7852349
    Szeregowy Maliniak
    Poziom 11  
    Posty: 36
    Ocena: 6
    Teraz działa, tylko teraz program wygląda mniej przejrzyście. Jak zrobić by działo to w osobnych plikach ?
  • Pomocny post
    #11 7854477
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    Jest to problem stary jak świat, rozwiązanie z użyciem preprocesora.

    plik klasa.hpp:
    #ifndef KLASA_HPP
    #define KLASA_HPP
    
    // kod pliku
    
    #endif // ifndef KLASA_HPP

    Jeśli tak "zawiniesz" każdy plik z deklaracjami klas, to nie będziesz miał problemów z redefinicjami.

    Pozdrawiam,
    Dr.Vee
  • #12 7856148
    Szeregowy Maliniak
    Poziom 11  
    Posty: 36
    Ocena: 6
    Następne pytanie:
    Dodałem sklep do planszy :D , kod wygląda tak
    void sklep(int x,int  y, rycerz & soldier)
    {
    	int a=0;
    	gotoxy(7,5);
    	cout<<"S";
    	if(x==7&&y==5)
    
    	{
    		system("cls");
    		cout<<"Witaj, "<<soldier.getNick()<<". Moze zainteresuje Cie jeden z moich towarow?\n";
    		cout<<"1. Health Potion  40 zlota\n";
    		cin>>a;
    		switch (a)
    		{
    			case 1:
    				cout<<"Dzieki, milo sie z Toba robi interesy\n";
    				soldier.addHp(10);
    				soldier.addZloto(-40);
    				break;
    			default:
    				cout<<"Nie mam takiego towaru\n";
    				break;
    		}
    		_sleep(2000);
    		system("cls");
    		getch();
    	}	
    }


    Wszystko prawie działa, tylko jest problem gdy wybiore coś czego nie ma w sklepie. Pokazuje mi ładnie że nie ma takiego towaru, tylko że jak chcę znowu wejść do sklepu to od razu pokazuje mi, że nie ma takiego towaru i nie mogę sobie nic kupić. Jak to naprawić?

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problemy związane z błędami w kodzie C++ przy tworzeniu klasy rycerza. Użytkownik napotkał trudności z konwersją typu string na char oraz z redefinicją klasy. Odpowiedzi sugerowały, aby zmienić typ zwracanej wartości w funkcji getNick z char na string, co rozwiązałoby problem niekompatybilności typów. Dodatkowo, poruszono kwestie związane z podwójnym includowaniem plików nagłówkowych, co prowadziło do błędu redefinicji klasy. Użytkownik uzyskał pomoc w zakresie użycia preprocesora do zapobiegania tym błędom. W końcu, po rozwiązaniu problemów z organizacją kodu, użytkownik zadał pytanie dotyczące obsługi błędów w funkcji sklepu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA