• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

używanie zmiennej z klasy w pliku .cpp tej klasy w funcji

Object Storage Arubacloud
0 głosów
191 wizyt
pytanie zadane 21 grudnia 2019 w C i C++ przez ArbuzWMeloniku Nowicjusz (120 p.)

chcę stworzyć prostą grę łączącą kółko i krzyżyk i zasadami działania maszyny Turinga, w tym celu stworzyłem klasę PLANSZA która przechowuje wszystkie potrzebne zmienne i funkcje do działania tej gry.

w pliku plansza.cpp napisałem metody klasy i dodatkowo skorzystałem z funkcji ażeby kod był czytelniejszy. jednak w funcjach potrzebne mi są zmienne z klasy PLANSZA , a sposób w który chciałem to zaimplementować wyrzuca błąd.

nazwa błędu to [Error] invalid use of non-static data member 'plansza::gracz'

main.cpp

#include <iostream>
#include "plansza.h"
using namespace std;

int main() {
	plansza gra;
	gra.gracz='X';
	gra.pozycja=1;
	while(true)
	{
		gra.wyswietl();
		gra.ruch();
		gra.wygrana();
	}
	return 0;
}

plansza.h

#include <iostream>
using namespace std;

class plansza
{
	public:
		int pozycja;		//pozycja strzałki
		char tasma[3];		//tablica bedzie taśmą czyli polami planszy
		char gracz;			//zawiera informacje o tym który gracz wykonuje ruch jako pierwszy
		
		void ruch();		//wykonuje ruch
		void wygrana();     //spraedza czy lub który gracz wygrał
		void wyswietl();	//wyswietla plansze
};

plansza.cpp

#include "plansza.h"
#include <iostream>
char zmiana()	//zwraca znak przeciwnego gracza
{
	if(plansza::gracz='X')	return 'O';
	if(plansza::gracz='O')	return 'X';
}

void zmianapozycji(char kierunek)	// zmienia przesuwa pozycje w prawo lub lewo
{
	if(kierunek=='L')	plansza::pozycja--;
	if(kierunek=='P')	plansza::pozycja++;
	if(plansza::pozycja==0)	plansza::pozycja++;
	if(plansza::pozycja==4)	plansza::pozycja--;
}
void zmianaznaku(char czynadpisac,char znak)	//nadpisuje znak
{
	if(czynadpisac=='T')
	{
		if(plansza::tasma[pozycja]=='X')	plansza::tasma[pozycja]='O';
		if(plansza::tasma[pozycja]=='O')	plansza::tasma[pozycja]='X';
		if(plansza::tasma[pozycja]=='0')	plansza::tasma[pozycja]=znak;	
	}	
}
//metody planszy
void plansza::ruch()
{
	char graczdrugi=zmiana(gracz);	//przechowuje informacje o tym kto jest 2 graczem
	
	char przemieszczeniex;	//przechowuje informacje o przemiesczeniu gracza 1
	char przemieszczeniey;	//przechowuje informacje o przemiesczeniu gracza 2
	
	char nadpisaniex;	//przechowuje informacje o tym czy gracz 1 nadpisuje znak
	char nadpisaniey;	//przechowuje informacje o tym czy gracz 2 nadpisuje znak
	
	cout<<"kolej gracza"<<gracz<<endl;
		<<"w ktora strone chcesz sie przemiescic? L/P"<<endl;
	cin>>przemieszczeniex;	//przechowuje informacje o przemieszczeniu gracza 1
	cout<<endl<<"czy chcesz nadpisac? T/N"<<endl;
	cin>>nadpisaniex;		//przechowuje informacje o nadpisaniu gracza 1
	
	cout<<"kolej gracza"<<graczdrugi<<endl;
		<<"w ktora strone chcesz sie przemiescic? L/P"<<endl;
	cin>>przemieszczeniey;	//przechowuje informacje o przemieszczeniu gracza 2
	cout<<endl<<"czy chcesz nadpisac? T/N"<<endl;
	cin>>nadpisaniey;		//przechowuje informacje o nadpisaniu gracza 2
	
	zmianapozycji(przemieszczeniex);
	zmianaznaku(nadpisaniex,gracz);
	
	zmianapozycji(przemieszczeniey);
	zmianaznaku(nadpisaniey,graczdrugi);
	
	gracz=zmiana(gracz);		//na koniec zmienia gracza pierwszego z drugim
}
void plansza::wygrana()		//jesli wszytkie 3 znaki sa takie same wygrywa gracz o tym znaku
{
	if(tasma[0]==tasma[1]==tasma[2]=='X'){
		cout<<"wygral gracz X"<<endl;
		exit(0);
	}
	if(tasma[0]==tasma[1]==tasma[2]=='O'){
		cout<<"wygral gracz O"<<endl;
		exit(0);
	}	
}
void plansza::wyswietl()	//wyswietla plansze
{
	for(int i=0;i<(pozycja-1);i++)
	{
		cout<<" /t";
	}
	cout<<"V"<<endl;
	
	for(int i=0;i<3;i++)
	{
		cout<<tasma[i]<<"\t";
	}
}

 

1 odpowiedź

+1 głos
odpowiedź 21 grudnia 2019 przez Michałełe Nałogowiec (25,600 p.)

Witam

Wyskakuje error, a w nim wiadomość, że próbujesz użyć niestatycznej zmiennej

Popatrz na funkcję

char zmiana()   //zwraca znak przeciwnego gracza
{
    if(plansza::gracz='X')  return 'O';
    if(plansza::gracz='O')  return 'X';
}

I rzeczywiście - funkcja ta nie przyjmuje żadnych argumentów, ani nie jest metodą żadnej klasy - więc skąd ma wiedzieć o jaką planszę właściwie chodzi (a w dodatku żadna zmienna ani metoda w klasie plansza nie jest statyczna)?

Spróbuj przyjąć obiekt jako argument i z niego wyczytać zmienna znak

komentarz 21 grudnia 2019 przez ArbuzWMeloniku Nowicjusz (120 p.)
jaki konkretnie obiekt mam dać na argument? ta funkcja jest wykorzystywana jedynie przy definicji metody, więc nie może przyjmować żadnego obiektu . próbowałem usunąć tę funkcje i wprowadzić ją "na siłę" kopiując tam gdzie była potrzebna. ale wyskakuje inny dziwniejszy błąd.

PS. samą funkcje char zmiana naprawiłem ale wynikało to ze sposobu w jaki z niej korzystam
komentarz 21 grudnia 2019 przez niezalogowany

if(tasma[0]==tasma[1]==tasma[2]=='X') // też bym tak chciał ale kompilator nie pozwala

się kompiluje ale czy oto chodziło to nie wiem i dlaczego się kompiluje to nie wiem:)

ale pewnie jaką odpowiedz można znaleźć jak się prześledzi to forum od końca:)

main

#include <iostream>
#include "plansza.h"
using namespace std;
int plansza::pozycja;
char plansza::tasma[3] {0,0,0};
char plansza::gracz;


int main()
{
    plansza gra;
    int stop=9;
    gra.gracz='X';
    gra.pozycja=1;
    while(gra.wygrana() and stop--)
    {
        gra.wyswietl();
        gra.ruch();
    }
    return 0;
}

plansza.h

#ifndef PLANSZA_H
#define PLANSZA_H
#include <iostream>

class plansza
{
    public:
        static int pozycja;        //pozycja strzałki
        static char tasma[3];      //tablica bedzie taśmą czyli polami planszy
        static char gracz;         //zawiera informacje o tym który gracz wykonuje ruch jako pierwszy

        void ruch();        //wykonuje ruch
        bool wygrana();     //spraedza czy lub który gracz wygrał
        void wyswietl();

       ~plansza(){
       }
         //wyswietla plansze
};

#endif // PLANSZA_H

plansza.cpp

#include "plansza.h"
#include <iostream>
#include "funkcje.h"
//metody planszy
void plansza::ruch()
{
    char graczdrugi=zmiana();  //przechowuje informacje o tym kto jest 2 graczem

    char przemieszczeniex;  //przechowuje informacje o przemiesczeniu gracza 1
    char przemieszczeniey;  //przechowuje informacje o przemiesczeniu gracza 2

    char nadpisaniex;   //przechowuje informacje o tym czy gracz 1 nadpisuje znak
    char nadpisaniey;   //przechowuje informacje o tym czy gracz 2 nadpisuje znak

    std::cout<<"kolej gracza"<<gracz<<std::endl;
    std::cout    <<"w ktora strone chcesz sie przemiescic? L/P"<<std::endl;
    std::cin>>przemieszczeniex;    //przechowuje informacje o przemieszczeniu gracza 1
    std::cout<<std::endl<<"czy chcesz nadpisac? T/N"<<std::endl;
    std::cin>>nadpisaniex;     //przechowuje informacje o nadpisaniu gracza 1

    std::cout<<"kolej gracza"<<graczdrugi<<std::endl;
    std::cout    <<"w ktora strone chcesz sie przemiescic? L/P"<<std::endl;
    std::cin>>przemieszczeniey;    //przechowuje informacje o przemieszczeniu gracza 2
    std::cout<<std::endl<<"czy chcesz nadpisac? T/N"<<std::endl;
    std::cin>>nadpisaniey;     //przechowuje informacje o nadpisaniu gracza 2

    zmianapozycji(przemieszczeniex);
    zmianaznaku(nadpisaniex,gracz);

    zmianapozycji(przemieszczeniey);
    zmianaznaku(nadpisaniey,graczdrugi);

    gracz=zmiana();        //na koniec zmienia gracza pierwszego z drugim
}
bool plansza::wygrana()     //jesli wszytkie 3 znaki sa takie same wygrywa gracz o tym znaku
{
    //if(tasma[0]==tasma[1]==tasma[2]=='X'){
    if(tasma[0]==tasma[1] and tasma[1]==tasma[2] and tasma[0]!=0)
    {
        if(tasma[0]=='X')
            std::cout<<"wygral gracz X"<<std::endl;
        else
            std::cout<<"wygral gracz O"<<std::endl;
      return 0;
    } else return 1;

}
void plansza::wyswietl()    //wyswietla plansze
{
    for(int i=0; i<(pozycja-1); i++)
    {
        std::cout<<" /t";
    }
    std::cout<<"V"<<std::endl;

    for(int i=0; i<3; i++)
    {
        std::cout<<tasma[i]<<"\t";
    }
}

i dodatkowo na te wolne funkcje

funkcje.h

#ifndef FUNKCJE_H
#define FUNKCJE_H
#include "plansza.h"


 char zmiana()   //zwraca znak przeciwnego gracza
{
    if(plansza::gracz=='X')  return 'O';
    if(plansza::gracz=='O')  return 'X';
    return 0;
}

 void zmianapozycji(char kierunek)   // zmienia przesuwa pozycje w prawo lub lewo
{
    if(kierunek=='L')   plansza::pozycja--;
    if(kierunek=='P')   plansza::pozycja++;
    if(plansza::pozycja==0) plansza::pozycja++;
    if(plansza::pozycja==4) plansza::pozycja--;
}
 void zmianaznaku(char czynadpisac,char znak)    //nadpisuje znak
{
    if(czynadpisac=='T')
    {
        if(plansza::tasma[plansza::pozycja]=='X')    plansza::tasma[plansza::pozycja]='O';
        if(plansza::tasma[plansza::pozycja]=='O')    plansza::tasma[plansza::pozycja]='X';
        if(plansza::tasma[plansza::pozycja]=='0')    plansza::tasma[plansza::pozycja]=znak;
    }
}
#endif // FUNKCJE_H

 

komentarz 22 grudnia 2019 przez niezalogowany

@Michałełe,

Aczkolwiek też uważam ,że to powinno być zrobione jakoś tak
 

class plansza{};
class gracz{};
class rozgrywka{

rozgrywka(plansza* obecna ):current(obecna){}

plansza * current;
gracz player1;
gracz plajer2;
//static  vector<gracz> gracze

}
int main{}

 

Podobne pytania

0 głosów
2 odpowiedzi 300 wizyt
pytanie zadane 27 maja 2018 w C i C++ przez Stu Nowicjusz (190 p.)
0 głosów
1 odpowiedź 1,633 wizyt
pytanie zadane 5 kwietnia 2018 w C i C++ przez Archeon Początkujący (480 p.)
0 głosów
2 odpowiedzi 229 wizyt

92,567 zapytań

141,420 odpowiedzi

319,616 komentarzy

61,953 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...