C++ odczytywanie/zmienianie wartości w obiektach

0

Witam, programuje właśnie grę w konsoli, chciałem wstępnie ją skompilować no i wyskoczyła lista takich samych błędów:
"
cpp23: error: ‘class pionek’ has no member named ‘kolor’
else if(tab[i][k].kolor==BIALY)
^
"

Błędy są z następującego pliku:

#include<iostream>
#include<string>
#include<cstdlib>
#include"warcaby.hpp"
#define CZARNY 1
#define BIALY 2
#define BRAK 0
#define PIONEK 1
#define DAMKA 2
using namespace std;

pionek::pionek ()
	{
	int typ=PIONEK;
	int kolor=BRAK;
	bool blokada=false; // czy dany pionek moze sie ruszac
	bool walecznosc=false; // czy dany pionek ma bicie w danej turze
	}
	
plansza::plansza()
	{
	int liczba_czarnych=12;
	int liczba_bialych=12;
	tab = new pionek*[8];
	for(int i=0;i<8;i=i+1)
		{
    		tab[i] = new pionek[8];
    		}
	}
		
void plansza::przemiesc_pionka(int x1, int y1, int x2, int y2) //z 1 na 2  
	{
	tab[x2][y2]->typ=tab[x1][y1]->typ;
	tab[x2][y2]->kolor=tab[x1][y1]->kolor;
	tab[x2][y2]->typ=BRAK;
	tab[x2][y2]->kolor=BRAK;
	}
	
void plansza::usuwanie_pionka(int x,int y)
	{
	tab[x][y]->typ=BRAK;
	tab[x][y]->kolor=BRAK;
	tab[x][y]->blokada=false;
	tab[x][y]->walczenosc=false;
	}
void plansza::ruchliwosc(int x,int y, int czarnybialy)
	{
	if((tab[x][y]->typ==PIONEK) && (tab[x][y]->kolor==czarnybialy))
		{
			if(tab[x][y]->kolor==BIALY)
				{
				if((y<7)&&(y>=0)&&(x<7)&&(x>0)&&((tab[x-1][y+1]->typ==BRAK)||(tab[x+1][y+1]->typ==BRAK)))
					{
					tab[x][y]->blokada=false;	
					}
				else if ((y<7)&&(y>=0)&&(x==0)&&(tab[x+1][y+1]->typ==BRAK))
					{
					tab[x][y]->blokada=false;
					}
				else if ((y<7)&&(y>=0)&&(x==7)&&(tab[x-1][y+1]->typ==BRAK))
					{
					tab[x][y]->blokada=false;
					}
				else
					{
					tab[x][y]->blokada=true;
					}
				}
			else
				{
				if((y<=7)&&(y>0)&&(x<7)&&(x>0)&&((tab[x-1][y-1]->typ==BRAK)||(tab[x+1][y-1]->typ==BRAK)))
					{
					tab[x][y]->blokada=false;	
					}
				else if ((y<=7)&&(y>0)&&(x==0)&&(tab[x+1][y-1]->typ==BRAK))
					{
					tab[x][y]->blokada=false;
					}
				else if ((y<=7)&&(y>0)&&(x==7)&&(tab[x-1][y-1]->typ==BRAK))
					{
					tab[x][y]->blokada=false;
					}
				else
					{
					tab[x][y]->blokada=true;
					}
				}
		}
	else
		{
		if((tab[x][y]->typ==DAMKA) && (tab[x][y]->kolor==czarnybialy))
			{}
		else
			{
			tab[x][y]->blokada=true;
			}
		}
	}
	
void plansza::bitewnosc(int x,int y, int czarnybialy)
	{
	if((tab[x][y]->typ==PIONEK) && (tab[x][y]->kolor==czarnybialy))
		{
		if((x>=2)&&(y<=5)&&(tab[x-1][y+1]->typ!=BRAK)&&(tab[x-1][y+1]->kolor!=czarnybialy)&&(tab[x-2][y+2]->typ==BRAK))
			{
			tab[x][y]->walecznosc=true;
			return;
			}
		if((x>=2)&&(y>=2)&&(tab[x-1][y-1]->typ!=BRAK)&&(tab[x-1][y-1]->kolor!=czarnybialy)&&(tab[x-2][y-2]->typ==BRAK))
			{
			tab[x][y]->walecznosc=true;
			return;
			}
		if((x<=5)&&(y>=2)&&(tab[x+1][y-1]->typ!=BRAK)&&(tab[x+1][y-1]->kolor!=czarnybialy)&&(tab[x+2][y-2]->typ==BRAK))
			{
			tab[x][y]->walecznosc=true;
			return;
			}
		if((x<=5)&&(y<=5)&&(tab[x+1][y+1]->typ!=BRAK)&&(tab[x+1][y+1]->kolor!=czarnybialy)&&(tab[x+2][y+2]->typ==BRAK))
			{
			tab[x][y]->walecznosc=true;
			return;
			}
		tab[x][y]->walecznosc=false;
			
		}
	else if((tab[x][y]->typ==DAMKA) && (tab[x][y]->kolor==czarnybialy))//damka
		{
		
		}
	}
	
void plansza::ustawianie_pionkow()
	{
	for(i=0;i<8;i=i+2)
		{
		tab[0][i]->typ=PIONEK;
		tab[1][i+1]->typ=PIONEK;
		tab[2][i]->typ=PIONEK;
		tab[5][i+1]->typ=PIONEK;
		tab[6][i]->typ=PIONEK;
		tab[7][i+1]->typ=PIONEK;
		
		tab[0][i]->kolor=BIALY;
		tab[1][i+1]->kolor=BIALY;
		tab[2][i]->kolor=BIALY;
		tab[5][i+1]->kolor=BIALY;
		tab[6][i]->kolor=BIALY;
		tab[7][i+1]->kolor=BIALY;
		}
	}
void plansza::drukowanie(int czarnybialy)
	{
	int i;
	int k;
	if(czarnybialy==BIALY)
		{
		for(i=0;i<8;i=i+1)
			{
			cout << 8-i << " ";
			for(k=0;k<8;k=k+1)
				{
				cout << "[";
				if(tab[i][k]->kolor==BRAK)
					{
					cout << " ";
					}
				else if(tab[i][k]->kolor==BIALY)
					{
					cout << "B";
					}
				else
					{
					cout << "C";
					}
				cout << "]";
				}
			cout << endl;
			}
			cout << "   A  B  C  D  E  F  G  H";
		}
	else
		
		{
		for(i=7;i>=0;i=i-1)
			{
			cout << 8-i << " ";
			for(k=7;k>=0;k=k-1)
				{
				cout << "[";
				if(tab[i][k]->kolor==BRAK)
					{
					cout << " ";
					}
				else if(tab[i][k]->kolor==BIALY)
					{
					cout << "B";
					}
				else
					{
					cout << "C";
					}
				cout << "]"
				}
			cout << endl;
			}
			cout << "   H  G  F  E  D  C  B  A"<< endl;
		}
	}		
		
bool plansza::czy_jest_bicieruch(int czarnybialy)//sprawdza czy któryś pionek ma bicie + ustawia blokady ruchu na pionki
	{
	int i;
	int k;
	int sprawdzenie=0;
	for(i=0;i<8;i=i+1)
		{
		for(k=0;k<8;k=k+1)
			{
			ruchliwosc(i,y,czarnybialy);
			bitewnosc(i,y,czarnybialy);
			}
		}
	if(sprawdzenie!=0)
		{
		return true;
		}
	else
		{
		return false;
		}
	}
	
plansza::~plansza()
	{
	for(int i=0;i<8;i=i+1)
		{
		for(int k=0;k<8;k=k+1)
			{
			delete pionek tab[i][k];
			}
		}
	}
 

Jakaś porada ?
Dzięki z góry za pomoc!

2
pionek::pionek ()
{
    int typ=PIONEK;
    int kolor=BRAK;
    bool blokada=false; // czy dany pionek moze sie ruszac
    bool walecznosc=false; // czy dany pionek ma bicie w danej turze
}

Tworzysz tutaj 4 tymczasowe zmienne, które znikną po wyjściu z konstruktora. Jeśli chcesz mieć zmienną w klasie, to musisz tam dodać np.

class pionek
{
    ...
    int kolor;
};

pionek::pionek()
{
    ...
    kolor = BRAK;         // zauwaz, ze nie ma "int" przed kolor, bo nie deklarujesz nowej zmiennej
}
2

Pierwsza porada: formatuj kod
Druga: podziel go odpowiednio na pliki
Trzecia:

pionek::pionek ()
    {
    int typ=PIONEK;
    int kolor=BRAK;
    bool blokada=false; // czy dany pionek moze sie ruszac
    bool walecznosc=false; // czy dany pionek ma bicie w danej turze
    } 

Takie coś stworzy Ci zmienne typ, kolor itd.. tylko na chwilę w konstruktorze pionka. Pokaż deklarację klasy/struktury pionek

0

Dzięki za pomoc, biorę się za poprawianie! A pliki mam podzielone, osobno mam plik testowy, i osobno z klasami.
EDIT: Chyba, że chodzi o jakieś szersze rozdzielanie ?

0

Wg mnie definicje klas pionek i plansza powinny być w innych plikach. Tutaj masz konstruktor pionka

Z takich porad jeszcze to zamieniłbym #definy na jakiegoś enuma ;)

0

Poprawiłem poprzednie błędy, ale problem pozostał ten sam...
Wyśle obydwa pliki:

#include<iostream>
#include<string>
#include<cstdlib>
#include"warcaby.hpp"
#define CZARNY 1
#define BIALY 2
#define BRAK 0
#define PIONEK 1
#define DAMKA 2
using namespace std;

pionek::pionek ()
	{
	typ=PIONEK;
	kolor=BRAK;
	blokada=false; // czy dany pionek moze sie ruszac
	walecznosc=false; // czy dany pionek ma bicie w danej turze
	}
	
plansza::plansza()
	{
	liczba_czarnych=12;
	liczba_bialych=12;
	tab = new pionek*[8];
	for(int i=0;i<8;i=i+1)
		{
    		tab[i] = new pionek[8];
    		}
	}
		
void plansza::przemiesc_pionka(int x1, int y1, int x2, int y2) //z 1 na 2  
	{
	tab[x2][y2]->typ=tab[x1][y1]->typ;
	tab[x2][y2]->kolor=tab[x1][y1]->kolor;
	tab[x2][y2]->typ=BRAK;
	tab[x2][y2]->kolor=BRAK;
	}
	
void plansza::usuwanie_pionka(int x,int y)
	{
	tab[x][y]->typ=BRAK;
	tab[x][y]->kolor=BRAK;
	tab[x][y]->blokada=false;
	tab[x][y]->walczenosc=false;
	}
void plansza::ruchliwosc(int x,int y, int czarnybialy)
	{
	if((tab[x][y]->typ==PIONEK) && (tab[x][y]->kolor==czarnybialy))
		{
			if(tab[x][y]->kolor==BIALY)
				{
				if((y<7)&&(y>=0)&&(x<7)&&(x>0)&&((tab[x-1][y+1]->typ==BRAK)||(tab[x+1][y+1]->typ==BRAK)))
					{
					tab[x][y]->blokada=false;	
					}
				else if ((y<7)&&(y>=0)&&(x==0)&&(tab[x+1][y+1]->typ==BRAK))
					{
					tab[x][y]->blokada=false;
					}
				else if ((y<7)&&(y>=0)&&(x==7)&&(tab[x-1][y+1]->typ==BRAK))
					{
					tab[x][y]->blokada=false;
					}
				else
					{
					tab[x][y]->blokada=true;
					}
				}
			else
				{
				if((y<=7)&&(y>0)&&(x<7)&&(x>0)&&((tab[x-1][y-1]->typ==BRAK)||(tab[x+1][y-1]->typ==BRAK)))
					{
					tab[x][y]->blokada=false;	
					}
				else if ((y<=7)&&(y>0)&&(x==0)&&(tab[x+1][y-1]->typ==BRAK))
					{
					tab[x][y]->blokada=false;
					}
				else if ((y<=7)&&(y>0)&&(x==7)&&(tab[x-1][y-1]->typ==BRAK))
					{
					tab[x][y]->blokada=false;
					}
				else
					{
					tab[x][y]->blokada=true;
					}
				}
		}
	else
		{
		if((tab[x][y]->typ==DAMKA) && (tab[x][y]->kolor==czarnybialy))
			{}
		else
			{
			tab[x][y]->blokada=true;
			}
		}
	}
	
void plansza::bitewnosc(int x,int y, int czarnybialy)
	{
	if((tab[x][y]->typ==PIONEK) && (tab[x][y]->kolor==czarnybialy))
		{
		if((x>=2)&&(y<=5)&&(tab[x-1][y+1]->typ!=BRAK)&&(tab[x-1][y+1]->kolor!=czarnybialy)&&(tab[x-2][y+2]->typ==BRAK))
			{
			tab[x][y]->walecznosc=true;
			return;
			}
		if((x>=2)&&(y>=2)&&(tab[x-1][y-1]->typ!=BRAK)&&(tab[x-1][y-1]->kolor!=czarnybialy)&&(tab[x-2][y-2]->typ==BRAK))
			{
			tab[x][y]->walecznosc=true;
			return;
			}
		if((x<=5)&&(y>=2)&&(tab[x+1][y-1]->typ!=BRAK)&&(tab[x+1][y-1]->kolor!=czarnybialy)&&(tab[x+2][y-2]->typ==BRAK))
			{
			tab[x][y]->walecznosc=true;
			return;
			}
		if((x<=5)&&(y<=5)&&(tab[x+1][y+1]->typ!=BRAK)&&(tab[x+1][y+1]->kolor!=czarnybialy)&&(tab[x+2][y+2]->typ==BRAK))
			{
			tab[x][y]->walecznosc=true;
			return;
			}
		tab[x][y]->walecznosc=false;
			
		}
	else if((tab[x][y]->typ==DAMKA) && (tab[x][y]->kolor==czarnybialy))//damka
		{
		
		}
	}
	
void plansza::ustawianie_pionkow()
	{
	for(int i=0;i<8;i=i+2)
		{
		tab[0][i]->typ=PIONEK;
		tab[1][i+1]->typ=PIONEK;
		tab[2][i]->typ=PIONEK;
		tab[5][i+1]->typ=PIONEK;
		tab[6][i]->typ=PIONEK;
		tab[7][i+1]->typ=PIONEK;
		
		tab[0][i]->kolor=BIALY;
		tab[1][i+1]->kolor=BIALY;
		tab[2][i]->kolor=BIALY;
		tab[5][i+1]->kolor=BIALY;
		tab[6][i]->kolor=BIALY;
		tab[7][i+1]->kolor=BIALY;
		}
	}
void plansza::drukowanie(int czarnybialy)
	{
	int i;
	int k;
	if(czarnybialy==BIALY)
		{
		for(i=0;i<8;i=i+1)
			{
			cout << 8-i << " ";
			for(k=0;k<8;k=k+1)
				{
				cout << "[";
				if(tab[i][k]->kolor==BRAK)
					{
					cout << " ";
					}
				else if(tab[i][k]->kolor==BIALY)
					{
					cout << "B";
					}
				else
					{
					cout << "C";
					}
				cout << "]";
				}
			cout << endl;
			}
			cout << "   A  B  C  D  E  F  G  H";
		}
	else
		
		{
		for(i=7;i>=0;i=i-1)
			{
			cout << 8-i << " ";
			for(k=7;k>=0;k=k-1)
				{
				cout << "[";
				if(tab[i][k]->kolor==BRAK)
					{
					cout << " ";
					}
				else if(tab[i][k]->kolor==BIALY)
					{
					cout << "B";
					}
				else
					{
					cout << "C";
					}
				cout << "]"
				}
			cout << endl;
			}
			cout << "   H  G  F  E  D  C  B  A"<< endl;
		}
	}		
		
bool plansza::czy_jest_bicieruch(int czarnybialy)//sprawdza czy któryś pionek ma bicie + ustawia blokady ruchu na pionki
	{
	int i;
	int k;
	int sprawdzenie=0;
	for(i=0;i<8;i=i+1)
		{
		for(k=0;k<8;k=k+1)
			{
			ruchliwosc(i,k,czarnybialy);
			bitewnosc(i,k,czarnybialy);
			}
		}
	if(sprawdzenie!=0)
		{
		return true;
		}
	else
		{
		return false;
		}
	}
	
plansza::~plansza()
	{
	for(int i=0;i<8;i=i+1)
		{
		for(int k=0;k<8;k=k+1)
			{
			delete pionek tab[i][k];
			}
		}
	} 
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;




class pionek
	{
	public:	
		pionek();
		int typ;
		int kolor;
		bool blokada; // czy dany pionek moze sie ruszac
		bool walecznosc;

	};

class plansza
	{
	private:
		pionek** tab;
	public:
		plansza();	
		int liczba_czarnych;
		int liczba_bialych;
		void przemiesc_pionka(int x1, int y1, int x2, int y2);
		void usuwanie_pionka(int x,int y);
		void ruchliwosc(int x,int y,int czarnybialy);
		void bitewnosc(int x,int y, int czarnybialy);
		void ustawianie_pionkow();
		void drukowanie(int czarnybialy);
		bool czy_jest_bicieruch(int czarnybialy);
		~plansza();
	}; 
0
stryku napisał(a):

Wg mnie definicje klas pionek i plansza powinny być w innych plikach. Tutaj masz konstruktor pionka

Z takich porad jeszcze to zamieniłbym #definy na jakiegoś enuma ;)

Enum jest chyba tylko estetyczniejszy, czy działa też lepiej ?

1

jest lepszy pod każdym możliwym względem, czyli jak zawsze w przypadku kompilacji - pod względem uniwersalności, bezpieczeństwa i "nie fakapowania istniejącego kodu"

1
Armatorix napisał(a):

Poprawiłem poprzednie błędy, ale problem pozostał ten sam...
Co to znaczy ten sam? Jaki jest komunikat błędu, której linii dotyczy?

tab[x2][y2]->typ=tab[x1][y1]->typ;
....
pionek** tab;

tak na oko to powinno być tab[x1][y1].typ

I weź przepuść ten kod przez formater: http://format.krzaq.cc, bo tego oglądać się nie da.

0

Kropka załatwiła sprawe... dzięki!
Tylko czemu używać kropki a nie -> ? W przypadku innego programu w cpp stosowałem właśnie -> a w javie kropke.
(zaznaczam że nie jestem wytrawnym programistą, proszę o wyrozumiałość ;) )

1

Kropka przy obiekcie, strzałka przy wskaźniku.
tab[x2][y] to obiekt typu pionek, a nie wskaźnik do obiektu typu pionek.

1

. jest do klas i struktur , natomiast -> spotkałem tylko gdy operowałem na wskaźniku na klasę lub strukturę... taka drobna różnica

0

Dzięki, nawet pisze w kompilatorze. Dobrze, że nikt za głupotę nie karze xd

A wiecie może co nie tak jest z destruktorem ?

cpp18: error: expected primary-expression before ‘tab’
delete pionek tab[i][k];
^
cpp18: error: expected ‘;’ before ‘tab’

1
Armatorix napisał(a):

Dzięki, nawet pisze w kompilatorze. Dobrze, że nikt za głupotę nie karze xd

A wiecie może co nie tak jest z destruktorem ?

cpp18: error: expected primary-expression before ‘tab’
delete pionek tab[i][k];
^
cpp18: error: expected ‘;’ before ‘tab’

Tak wiemy - nie ma sensu. Zastanow sie co probujesz zwolnic. Jesli jest to pamiec na pojedynczy obiekt to robisz to tak:

delete wskaznik_na_obiekt;

jesli cala tablica obiektow to tak:

delete [] wskaznik_na_pierwszy_obiekt_w_tablicy;

Jesli tablica wskaznikow na obiekty to najpierw zwalniasz kazdy element z osobna a potem pamiec na tablice wskaznikow.

1

no delete nie chce typu tylko wskaźnik...

0

Dzięki wielkie! Chwilowo wszystko śmiga :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1