Problem z wyswietlaniem z klasy podstawowej, dziedziczenie

0
class zasady
{
protected:
	virtual void wysw_zasady();	/*Funkcja protected dla klasy po niej dziedziczacej*/
 
public:
	virtual void zasady0();		/*wyswietla zasady gry*/
}; 

void zasady::wysw_zasady()
{
	printf("Prosze o stosowanie sie do wymienionych zasad gry i informacji. Powodzenia!");
	printf("\n");
}
void zasady::zasady0()
{
	wysw_zasady();
}

class zasady_dal:public zasady
{
public:
	void zasady0();	/*WYSWIETLA ZASADY*/
};
 
void zasady_dal::zasady0()
{
	cout<<"Zasady gry sa proste:\n"<<endl;
	cout<<"Rozmiar planszy podaje uzytkownik. Plansza jest N x N"<<endl;
	cout<<"Przejscie planszy polega zapelnieniu planszy 0 lub 1"<<endl;
	cout<<"Plansza zawiera [bonusy] ktore zmieniaja inaczej sasiadow"<<endl;
	cout<<"\n";
}
 
 

Mam problem. Chce wywolac funkcje z klasy bazowej ktora jest taka sama pod wzgledem nazwy ale wyswietla co innego. Uzywajac dziedziczenia klasa pochodna otrzymuje to co ma klasa bazowa czyli funkcje wypisujaca zasady. Dlaczego ona nie dziala? Dlaczego musze zrobic rzutowanie zeby to zadzialalo? Co jest nie tak?

0

Rozumiem że nie warto pokazać kodu?
Funkcje są wirtualne więc jeśli masz wskaźniki/referencje to zadziała polimorfizm i wywoła się metoda z klasy pochodnej.

0
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <ctime>
#include <windows.h>
#include <stdio.h>
#include <string>

/* DARIUSZ KRUK 82708 All rights reserved.
*/

using namespace std;	/*PRZESTRZEN STD*/
 
/*---------------------------------Wzkaznik do TABLIC STATYCZNYCH DO PRZECHOWYWANIA STANU I TYPU PLANSZY*/
static int *tabstan;	/* Wzkaźnik do stanu planszy*/
static int *tabtyp;	/* Wzkaźnik do typu pola*/
static int rozmiar;	/*Podstawowy bok planszy*/
static int wymiar;	/*Plansza wymnozona juz*/


/*-----------------------------KLASA ZATRZYMUJACA DZIALANIE PROGRAMU NA MOMENT (PAUSE)*/
class Koniec
{
private:
	void pause();
public:
	void wysw_pause();
};
void Koniec::pause()	/*funckja pause jako private*/
{
	system("pause");
}
void Koniec::wysw_pause()	/*funkcja umozliwiajaca wyswietlanie prywatnej funkcji*/
{
	pause();
}
/*---------------------------KLASA CZYSZCZACA EKRAN ( OPIS TAKI SAM JAK W KLASIE KONIEC)*/
 class Czyszczenie
 {
 private:
	 void czyszcz();

 public:
	 void getczyszcz();

 };
void Czyszczenie::czyszcz()
 {
	 system("cls");
 }
void Czyszczenie::getczyszcz()
 {
	 czyszcz();
 }


/*KLASA ZASADY*/

class zasady
{
protected:
	virtual void wysw_zasady();	/*Funkcja protected dla klasy po niej dziedziczacej*/
 
public:
	virtual void zasady0();		/*wyswietla zasady gry*/
}; 

void zasady::wysw_zasady()
{
	printf("Prosze o stosowanie sie do wymienionych zasad gry i informacji. Powodzenia!");
	printf("\n");
}
void zasady::zasady0()
{
	wysw_zasady();
}
//*KLASA ŻEGNAJACA UŻYTKOWNIKA opis funkcji tak jak wyżej*/
class zakonczenie
{
private:
	void kon();
public:
	void wyp_kon();
};
void zakonczenie::kon()
{
	cout<<"Dziekuje za skorzystanie z aplikacji. Mam nadzieje ze sie podobala"<<endl;
}
void zakonczenie::wyp_kon()
{
	kon();
}

/*-KLASA DZIEDZICZACA PO BAZOWEJ ZASADY ZAWIERA W SOBIE METODY KLASY BAZOWEJ PLUS SWOJE*/
class zasady_dal:public zasady
{
public:
	void zasady0();	/*WYSWIETLA ZASADY*/
};
 
void zasady_dal::zasady0()
{
	cout<<"Zasady gry sa proste:\n"<<endl;
	cout<<"Rozmiar planszy podaje uzytkownik. Plansza jest N x N"<<endl;
	cout<<"Przejscie planszy polega zapelnieniu planszy 0 lub 1"<<endl;
	cout<<"Plansza zawiera [bonusy] ktore zmieniaja inaczej sasiadow"<<endl;
	cout<<"\n";
}
 
/*MENU1 INTERFEJS GRACZA FUNKCJA VOID*/
int menu1()
{
	int wybor;
	cout<<"Wybierz opcje:\n 1-NOWA GRA\n 2-WCZYTAJ GRE\n 3-Zakoncz"<<endl;
	cout<<"Twoj wybor:"<<endl;
	cin>>wybor;
	return wybor;
}

/*MENU2 INTERFEJS GRACZA FUNKCJA VOID*/

int menu2()
{
	int wybor;
	cout<<"Wybierz opcje:\n1-Podaj wspolrzedne\n2-Zapisz i Zakoncz"<<endl;
	cout<<"Twoj wybor:";
	cin>>wybor;
	return wybor;
}

/*USTAWIA PLANSZE DO ROZGRYWKI*/
void ustaw_plansze(int *tabstan,int *tabtyp, int wymiar)
{
	int j=0;
	for(int i=0;i<wymiar;i++)
	{
		tabstan[i]=rand()%2;
		tabtyp[j]=rand()%4+1;
		j++;
		
	}
}

/*WYSWIETLA PLANSZE*/
void wysw_plansze(int *tabstan,int *tabtyp, int rozmiar)

{
	for(int i=0;i<rozmiar;i++)
	{
		cout<<"\t";

		for(int j=0;j<rozmiar;j++)
		{
			cout<<tabstan[(i*rozmiar)+j];
		}
	cout<<"\n";
	}

	cout<<"\n";

	for(int i=0;i<rozmiar;i++)
	{
		cout<<"\t";

		for(int j=0;j<rozmiar;j++)
		{
			cout<<tabtyp[(i*rozmiar)+j];
		}
	cout<<"\n";
	}
	cout<<"\n";
}

/*ZMIANA POLA NA PLANSZY FUNKCJA*/
void zmiana_pola(int *tabstan, int *tabtyp, int x, int y,int rozmiar,int wymiar)
{
	/* ODPOWIEDNIE WARUNKI DLA ZMIANY POL */

	if((tabtyp[(x*rozmiar)+y]==1))
	{
		if((tabstan[(x*rozmiar)+y])==1)
		{
			*(tabstan+(x*rozmiar)+y)=0;
		}
		else
		{
			*(tabstan+((x*rozmiar)+y))=1;
		}
	}
	
	else if((x==0)&&(y==0)&&(tabtyp[(x*rozmiar)+y]==2))
	{
		*(tabstan+1)=rand()%2;
	}
	
	else if(tabtyp[(x*rozmiar)+y]==2)
	{
			*(tabstan+(x*rozmiar)+y-1)=rand()%2;
			*(tabstan+(x*rozmiar)+y+1)=rand()%2;
	}
	
	else if(tabtyp[(x*rozmiar)+y]==2&&(x+1==rozmiar)&&(y+1==rozmiar))
	{
		*(tabstan+(x*rozmiar)+rozmiar-1)=rand()%2;

	}

	else if(tabtyp[(x*rozmiar)+y]==3)
	{
		/*LOSOWE ZAPELNIANIE WYBRANEGO POLA PRZEZ WPOLRZEDNE LOSOWE 0 LUB 1. POWETARZA SIE 10 RAZY*/
		int a,b,c;
		for(int i=0;i<50;i++)
		{
			a=rand()%rozmiar;
			b=rand()%rozmiar;
			c=rand()%2;

			*(tabstan+(x*a)+b)=c;
		}
	}
	if((tabtyp[(x*rozmiar)+y]==4))
	{
		/*ZAPELNIANIE CALEJ PLANSZY 0 LUB 1. TAKIE NOWE USTAWIANIE PLANSZY. TYP POMOCNY PODCZAS ZASTOJU PLANSZY
		OK LOSUJE 0 LUB 1 DLA CALEJ PLANSZY. TRZEBA UWAZAC NA TEN TYP!!!!*/
	
		for(int i=0;i<wymiar;i++)
		{
			*(tabstan+i)=rand()%2;
		}
	}
}
	
/* FUNKCJA ZAPISUJACA AKTUALNY STAN GRY PO ZAKONCZENIU ROZGRYWKI*/
void zapis_gry()
{
	char n_zapis[10];
	int i=0;
	FILE* zapis;
	FILE* zapis2;
	FILE* zapis3;
	cout<<"Podaj nazwe pliku do zapisu stanu gry:";
	cin>>n_zapis;
	zapis=fopen(n_zapis,"w");
	zapis2=fopen("daneplanszy.txt","w");
	zapis3=fopen("globalne.txt","w");
	if(zapis!=NULL&&zapis2!=NULL)
	{
		cout<<"Utworzono pomyslnie plik i zapisano stan gy ;-)"<<endl;
		fprintf(zapis3,"%d %d",rozmiar,wymiar);

		for(i=0;i<wymiar;i++)
		{
			fprintf(zapis,"%d\n",*(tabstan+i));
			fprintf(zapis2,"%d\n",*(tabtyp+i));
		}

	}
	else
	{
		cout<<"BLAD nie mozna zapisac stanu gry-.-"<<endl;
	}
	fclose(zapis);
	fclose(zapis2);
	fclose(zapis3);
}

// FUNKCJA WCZYTUJACA STAN POPRZEDNIEJ GRY
void wczytanie_gry(int *tabstan,int *tabtyp)
{
	FILE* odczyt;
	FILE* odczyt2;
	char n_odczyt[10];
	cout<<"Podaj plik do odczytu:";
	cin>>n_odczyt;
	int i=0;
	odczyt=fopen(n_odczyt,"r");
	odczyt2=fopen("daneplanszy.txt","r");
	//SEEK_SET;

	if(odczyt==NULL)
	{
		cout<<"Blad"<<endl;
	}
	
	while(feof(odczyt)==0)
	{
			fscanf(odczyt,"%d",&tabstan[i]);
			i++;
	}
	i=0;
	while(feof(odczyt2)==0)
	{
			fscanf(odczyt2,"%d",&tabtyp[i]);
			i++;
	}
	
	cout<<"Zczytano dane zapisanej stan gy ;-)"<<endl;

	fclose(odczyt);
	fclose(odczyt2);
}

/* FUNKCJA WCZYTUJACA DANE GLOBALNE UZYWANE W CALYM PROGRAMIE. BARDZO WAZNE!!!!!!!!!!!!!!!*/
void wczytanie_globalnych()
{
	FILE* odczyt;
	
	odczyt=fopen("globalne.txt","r");
	fscanf(odczyt,"%d%d",&rozmiar,&wymiar);

	cout<<"Zczytano dane pomocnicze stan gy ;-)\n"<<endl;
	system("pause");
	fclose(odczyt);
}

/*CZYSCI TABLICE WCZYTYWANYCH GRACZY BY UNIKNAC SMIECI I BLEDNYCH DANYCH PODCZAS WCZYTYWANIA*/
void czyszcztab(char *graczdane)
{
	for(int i=0;i<10;i++)
	{
		graczdane[i]=NULL;
	}
}

/*FUNKCJA WYSWIETLAJACA NA EKRAN LISTE GRACZY*/
void wysw_gracz()
{
	FILE *gracz;		//PLIK GRACZY 
	char graczdane[10];
	gracz=fopen("gracz.txt","r");
	cout<<"Gracz wczesniejsi:"<<endl;

	while(feof(gracz)==0)
	{
		fscanf(gracz,"%s",&graczdane);
		printf("%s\n",graczdane);
		czyszcztab(graczdane);
	}
	fclose(gracz);
	cout<<"\n";
}

/*FUNKCJA ZAPISUJACA STAN GRY*/
void zapis_graczy()
{
	FILE *gracz;		/*PLIK GRACZY*/ 
	char graczdane[10];
	gracz=fopen("gracz.txt","a");
	cout<<"Podaj nick do gry:"<<endl;
	cin>>graczdane;
	fprintf(gracz,"%s\n",graczdane);
	fclose(gracz);
	cout<<"\n";
}

/*WYSWIETLANIE PIERWSZEJ WIADOMOSCI PO ROZPOCZECIU GRY*/
void poczatek_gry()
{
	cout<<"Podaj rozmiar planszy:"<<endl;
	cin>>rozmiar;
	wymiar=rozmiar*rozmiar;		/*ilosc pol w tablicy*/

	tabstan= new int[wymiar];	/*TWOTRZY PLANSZE STANU*/
	tabtyp=new int[wymiar];		/*TWORZY PLANSZE TYPOW*/
}

/*FUNKCJA WYPISUJACA PLANSZE PO WCZTANIU DANYCH NIEZBEDNYCH DO ROZGRYWKI*/
void po_wczytaniu()
{
	
	Koniec* kon,K;
	kon=&K;
	tabstan= new int[wymiar];	/*TWOTRZY PLANSZE STANU*/
	tabtyp=new int[wymiar];		/*TWORZY PLANSZE TYPOW*/
	
	wczytanie_gry(tabstan,tabtyp);
	wysw_plansze(tabstan,tabtyp,rozmiar);	/*Wyswietla plansze na ekran*/
	kon->wysw_pause();

}

/*funkcja sprawdzajaca plansze aby ukonczyc gre z sukcesem*/
int sprawdz(int *tabstan)
{
	int j=1;
	for(int i=0;i<wymiar;i++)
	{
		if(tabstan[i]!=1)
			j=0;
	
	}
	return j;
}

int main(int argc, char* argv[])
{
	/*WYWIETLANIE ZASAD*/

	/*OBIEKT CZYSZCZENIE*/
	Czyszczenie* wsk,A;
	wsk=&A;
	/*  OBIEKT KONIEC*/
	Koniec* kon,K;
	kon=&K;
	/* OBIEKT ZASADY*/
	//zasady *pb;
	zasady_dal k;
	//pb=&k; 
	k.zasady0();
	//pb->zasady::zasady0();
	kon->wysw_pause();	/*WYSWIETLANIE PAUSE*/
	//-------------------------------------------------------------------------
	A.getczyszcz();		/*CZYSCZENIE EKRANU*/


	/*Rozgrywka*/

	int wybor_gracz;	/*ZMIENNA PRZECHOWUJACA WYBOR GRACZA Z MENU*/
	wybor_gracz=menu1();

	int x,y;	/*WSPOLRZEDNE*/

	if(wybor_gracz==1)
	{
		srand(time(NULL));	/*FUNKCJA LOSUJACA*/

		zapis_graczy();		/*Zapisuje aktualnych dodanych graczy*/
		poczatek_gry();		/*PIERWSZY INTERFEJS*/

		ustaw_plansze(tabstan,tabtyp,wymiar);	/*ustawianie poczatkowej planszy*/
		wysw_plansze(tabstan,tabtyp,rozmiar);	/*Wyswietla plansze na ekran*/

		wybor_gracz=menu2();
		int v;		//zmienna przechowuje wartosc od funkcji sprawdzajacej czy cala plansza sklada sie z samych jedynek

		while(wybor_gracz!=2)
		{
			wybor_gracz=NULL; /*NULL PO TO ABY NIE BYLO BLEDOW W NADPISYWANIU DANYCH W ZMIENNEJ*/
			cout<<"Podaj wspolrzedne pola ktore chcesz zmienic:"<<endl;
			cout<<"Twoje wspolrzedne:";
			cin>>x;
			cin>>y;
			zmiana_pola(tabstan,tabtyp,x,y,rozmiar,wymiar);	//ZMIANA POLA NA PLANSZY*/
			A.getczyszcz();		/*CZYSCI EKRAN PO ZMIANIE*/

			wysw_plansze(tabstan,tabtyp,rozmiar);	/*Wyswietla plansze na ekran*/
			
			v=sprawdz(tabstan);			/*zmienna przechowujaca stan planszy czy jest zapelniona calkowicie 1*/

			if(v==0)
			{
				/*Pusty warunek */
			}
			else if(v==1)
			{

				cout<<"Gratulacje  udało ci sie przejsc gre"<<endl;
				zapis_gry();				/*PO KOLEI ZAPISUJE GRE USUWA WZKAZNIKI DO TABLIC GLOBALNYCH KONCZY GRE*/
				kon->wysw_pause();
				free (tabstan);
				free (tabtyp);
				zakonczenie *c,C;
				c=&C;
				c->wyp_kon();
				cout<<"\n";
				kon->wysw_pause();

				return 0;
			}
			wybor_gracz=menu2();
		}
	

		zapis_gry();	/*ZAPIS GRY*/
		kon->wysw_pause();
		free (tabstan);		/*USUWANIE WZKAZNIKOW DO TABLIC GLOBALNYCH*/
		free (tabtyp);
		zakonczenie *c,C;
		c=&C;
		c->wyp_kon();
		cout<<"\n";
		kon->wysw_pause();
		return 0;
	}
	if(wybor_gracz==2)
	{
		//  OBIEKT KONIEC
		Koniec* kon,K;
		kon=&K;

		wczytanie_globalnych();	/*Wczytanie zmiennych globalnych z pliku aby mozna bylo grac*/
		wysw_gracz();	/*wyswietla dotychczasowych graczy*/

		kon->wysw_pause();
		/*OBIEKT CZYSZCZENIE*/
		Czyszczenie* wsk,A;
		wsk=&A;
		wsk->getczyszcz();
	
		po_wczytaniu(); /*interfejs po wczytaniu gry*/
		wybor_gracz=menu2();
		int v;
		while(wybor_gracz!=2)
		{
			wybor_gracz=NULL;
			cout<<"Podaj wspolrzedne pola ktore chcesz zmienic:"<<endl;
			cout<<"Twoje wspolrzedne:";
			cin>>x;
			cin>>y;
			zmiana_pola(tabstan,tabtyp,x,y,rozmiar,wymiar);	/*ZMIANA POLA*/
			A.getczyszcz();		/*CZYSCI EKRAN PO ZMIANIE*/

			wysw_plansze(tabstan,tabtyp,rozmiar);	/*Wyswietla plansze na ekran*/
			wybor_gracz=menu2();
			v=sprawdz(tabstan);			/*zmienna przechowujaca stan planszy czy jest zapelniona calkowicie 1*/
			if(v==1)
			{
				cout<<"Gratulacje  udało ci sie przejsc gre"<<endl;
				zapis_gry();				/*PO KOLEI ZAPISUJE GRE USUWA WZKAZNIKI DO TABLIC GLOBALNYCH KONCZY GRE*/
				kon->wysw_pause();
				free (tabstan);
				free (tabtyp);
				zakonczenie *c,C;
				c=&C;
				c->wyp_kon();
				cout<<"\n";
				kon->wysw_pause();

				return 0;
			}

		}

		zapis_gry();				/*PO KOLEI ZAPISUJE GRE USUWA WZKAZNIKI DO TABLIC GLOBALNYCH KONCZY GRE*/
		kon->wysw_pause();
		free (tabstan);
		free (tabtyp);
		zakonczenie *c,C;
		c=&C;
		c->wyp_kon();
		cout<<"\n";
		kon->wysw_pause();

		return 0;
	}
	
	if(wybor_gracz==3)			/*ZAKONCZENIE GRY */
	{
		kon->wysw_pause();
		return 0;
	}

}
 

Kod jest dosc dlugi i ten moj problem jest w funkcji main zaraz na poczatku

0

To gdzie jest blad?

0

skończ tak durnie komentować kod bo tego czytać się nie da. Komentarze typu "deklaracja xxx", "przestrzeń nazw std;", przecież każdy kto zna dany język programowania wie co to znaczy i jak wygląda deklaracja, a czytać identyfikatory też każdy potrafi więc wystarczy je tylko normalnie nazywać :]

0

Wiem ze kazdy kto zajmuje sie danym jezykiem ma wiedze i wie co oznaczaja poszczegolne funkcje deklaracje itd. Te komentarze zostaly wykonane na prośbę cwiczeniowca aby mu bylo łatwiej na wszystko patrzeć itd.

0
easy napisał(a):

Wiem ze kazdy kto zajmuje sie danym jezykiem ma wiedze i wie co oznaczaja poszczegolne funkcje deklaracje itd. Te komentarze zostaly wykonane na prośbę cwiczeniowca aby mu bylo łatwiej na wszystko patrzeć itd.
ale ja nie jestem ćwiczeniowcem i oczekuję fragmentu kodu, który nie działa z ewentualnym komentarzem dlaczego nie działa. Sam stwierdziłeś, że "nie działa gdzieś na początku main" to wrzuć to, a nie takiego tasiemca nieczytelnego bo wątpię żeby komuś się chciało to rozszyfrowywać.

0

No ok rozumiem Cie.

To na co chciałem otrzymać odpowiedz zostalo zawarte w pierwszym poscie. Kod został wrzucony, bo Shalom napisał, więc wrzuciłem

0

No to powiecie dlaczego to sie nie wyswietla?

0
easy napisał(a):

No to powiecie dlaczego to sie nie wyswietla?

wydaje mi się, że @Shalom już odpowiedział.

0

A da sie zrobic tak aby przy tworzeniu obiektu ZASADY_DAL automatycznie wywolywala sie funkcja z klasy podstawowej?

0

Nie urzywajac rzutowania?

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