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

Polimorfizm 'Object' is an ambiguous base of 'ranking'

0 głosów
632 wizyt
pytanie zadane 27 października 2019 w C i C++ przez Wiktor Michalski Początkujący (430 p.)

Cześć!

Chciałem przerobić mój projekt, który jeszcze nie wykorzystywał polimorfizmu ale napotkałem na problem: error: 'Object' is an ambiguous base of 'ranking' w 142 linijce kodu main.cpp, czyli w wsk=⊤

Kod maina

#include <iostream>
#include <cstdlib>
#include "Book.h"
#include <fstream>
#include <Windows.h>

using namespace std;
Object *wsk;
void baza_ksiazek();
int wlaczenie_funkcji(int opcja);
int pokaz_menu(short int opcja);
int rodzaj_aplikacji(int wybor);
void wykonaj(int wybor);
void ranking_ksiazek();
int main() { //Funckja glowna	
	int wybor;
	wybor=rodzaj_aplikacji(wybor);
	return 0;
}
int rodzaj_aplikacji(int wybor)/// Menu co chcesz robic
{
	cout<<"Wybierz co chcesz robic: \n1.Baza ksiazek\n2.Ranking ksiazek\nTwoj wybor: ";
	cin>>wybor;
	wykonaj(wybor);
	return wybor;
}
void wykonaj(int wybor)/// Funkcja pierwsza wykonujaca baza ksiazek/top ksiazki/opis 
{
	if(!wybor)
{
	cout<<"\n\aOpcja nie poprawna!!! Koniec programu";
	exit(0);
}
	switch(wybor)
	{
		case 1:
			{
				baza_ksiazek();
				break;	
			}
		case 2:
			{
				ranking_ksiazek();
				break;
			}
		default:
			{
			system("cls");
			cout<<"\aOpcja nie poprawna"<<endl;
			main();
			}
	}
}
void baza_ksiazek()/// Funkcja wywolujaca menu oraz rozpoczecie clasy Book /////////////////////////////////////////////1 Funkcja/////////////////////////////////////////////////////
{
	short int opcja;
	opcja=pokaz_menu(opcja);
	wlaczenie_funkcji(opcja);
}
int pokaz_menu(short int opcja) // Funkcaj pokazujaca menu baza ksiazek
{
	cout<<"Menu: "<<endl;
	cout<<"1.Dodaj nowa ksiazka\n2.Wyswietl ksiazki\n3.Usun ksiazke\n4.Zamknij program\nWybrana opcja: ";
	cin>>opcja;
	return opcja;
}
void usuwaniemain(Object *wsk)
{
	system("cls");
	wsk->wyswietl();
	wsk->usuwanie();
	main();
}
void wyswietlmain(Object *wsk)
{
	system("cls");
	wsk->wyswietl();
	cout<<endl<<endl;
	main();
}
void koniecprogramu()
{
	system("cls");
	cout<<"Koniec programu";
	exit(0);
}
int wlaczenie_funkcji(int opcja) // Funkcja wywolujaca polecenia bazy ksiazek
{
	
	if(!opcja)
	{
		cout<<"\n\aOpcja nie poprawna";
		exit(0);
	}
	Book ksiazka;
	wsk = &ksiazka;
		switch(opcja)
		{
			case 1: //Nowa ksiazka 
			{
			wsk->wczytaj();
			wsk->sprawdz();
			wsk->zapisz();
			wsk->wyswietl();
			Sleep(3000);
			system("cls");
			main();
			break;
		    }
			case 2: //Wyswietl ksiazki
			{
			wyswietlmain(wsk);
			break;
			}

			case 3: // Usuwanie ksiazki
			{
			usuwaniemain(wsk);
			break;
		    }
			case 4: // Koniec programu
				{
				koniecprogramu();
			    break;
				}				
            default: // Wszystko inne
			{	
			system("cls");
			cout<<"\aOpcja nie poprawna"<<endl;
			main();
			}	
	    }
	
} 
void ranking_ksiazek()///////////////////////////////////////////////////////////////// 2 Funkcja ////////////////////////////////////////////////////////////////////////////////////////
{
	
	int opcja;
	cout<<"1.Stworz nowy ranking\n2.Pokaz ranking\n3.Koniec programu\n4.Usun wybrana pozycje ksiazki\nWybeirz opcje z podanych: ";
	cin>>opcja;
	ranking top;
	wsk=&top;
	switch(opcja)
	{
		case 1:
			{
			cout<<"Uwaga!! Podaj ranking w kolejnosci od 1-10\n";
			for(int i=0; i<10;i++)
			{
		    wsk->wczytaj();
		    wsk->sprawdz();
		    if(i==0)top.zapisz2();
		    else wsk->zapisz();
		    }
			wsk->wyswietl();
			Sleep(3000);
			main();
			break;
			}
		case 2:
			{
			wyswietlmain(wsk);
			break;
			}
		case 3:
			{
				koniecprogramu();
				break;
			}
		case 4:
			{
				usuwaniemain(wsk);
				break;
			}
		default:
			{
			system("cls");
			cout<<"\aOpcja nie poprawna"<<endl;
			main();
			}
	
	}
}

Kod pliku nagłówkowego:

#include <iostream>
using namespace std;

class Object//// kalsa abstrakcyjna
{
	public:
		virtual wczytaj();
		virtual wyswietl();
		virtual zapisz();
		virtual sprawdz();
		virtual usuwanie();
};
class Book :public Object//Pierwsza klasa do bazy ksiazek
{
	string tytul;
	string autor;
    int ilosc_stron;
	int jaka;
	bool decyzja;
	public:
		Book(string="nic", string="nic", int=0, int=0, bool=true);
		virtual wczytaj();
		virtual wyswietl();
		virtual zapisz();
		virtual sprawdz();
		virtual usuwanie();
		wyszukaj();
	//friend class ranking;
};
// druga klasa do rankingu ksiazek
class ranking: public Object, public Book
{
    int nr_pozycji;
    public:
    ranking(int=0);
 	virtual wczytaj();
 	virtual wyswietl();
 	virtual sprawdz();
 	virtual zapisz();
 	virtual usuwanie();
 	zapisz2();
};

Kod do Book.cpp z kodem klas

#include <iostream>
#include <string>
#include <cstdlib>
#include "Book.h"
#include <fstream>
#include <Windows.h>
#include <conio.h>
using namespace std;
// Pierwsza klasa //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Book::Book(string t, string a, int i, int j, bool d)
{
	tytul=t;
	autor=a;
	ilosc_stron=i;
	jaka=j;
	decyzja=d;
}
Book::wyswietl()
{
   fstream plik;
   if(decyzja==true)plik.open("Ksiazki.csv", ios::in);
   if(decyzja==false)plik.open("ranking.csv", ios::in);
   string linia;
   string col1 = "";
   string col2 = "";
   string col3 = "";
   string col4 = "";
   string col5="";
   int dl;
   int i;
   char znak;
   int col_poz;
    while(getline(plik, linia))
    {
    if(linia=="")
    {
    	continue;
	}
	else
	{
    dl=linia.size();
    for(int i=0;i<=dl;i++)
    {
		znak = linia[i]; ///przypisujemy aktualny znak
		if (znak==';') col_poz++; //sprawdzamy jesli zobaczy ; przejdzie do kolejnego wyrazu
		switch (col_poz){
		case 0:
			{
			if (znak!=';') col1 = col1 + linia[i];   //nie pszeszlo do kolejnego wyrazu wiec do col1 przypisuje po koleji kolejne litery za napotka znak
			break;
			}
		case 1:
			{
			if (znak!=';') col2 = col2 + linia[i]; // napotkalo po raz pierwszy znak wiec wypisuje kolejny wyraz do kolejne zmiennej
			break;
			}
		case 2:
			{
			if (znak!=';') col3 = col3 + linia[i];
			break;
			}
		case 3:
			{
			if (znak!=';') col4 = col4 + linia[i];
			break;
			}
			case 4:
		    {
		    if(znak!=';'&&decyzja==false) col5= col5+linia[i];
		    break;
			}

		}

	}
	cout<<"Tytul      : "<<col2<<endl;
	cout<<"Autor      : "<<col3<<endl;
	cout<<"Ilosc stron: "<<col4<<endl;
	if (col1=="1") cout<<"Ksiazka przeczytana"<<endl;
	else cout<<"Ksiazka do przeczytania !!"<<endl;
	if(decyzja==false)cout<<"Nr_Pozycji: "<<col5<<endl;
	col_poz =0;
	col1 = "";
    col2 = "";
    col3 = "";
    col4 = "";
    if(decyzja==false)col5="";
    linia="";
	}
}

    plik.close();
}
Book::wczytaj()
{
	string jaka2;
	cout<<"Podaj parametry: ";
	getline(cin, autor);
	cout<<endl<<"Tytul ksiazki: ";
	getline(cin, tytul);
	cout<<"Autor ksiazki: ";
	getline(cin, autor);
	cout<<"Ilosc stron: ";
	cin>>ilosc_stron;
	cout<<"Tak - Ksiazka przeczytana\nNie - Ksiazka do przeczytania\nPodaj typ ksiazki: ";
	cin>>jaka2;
	if(tytul.find(';')||autor.find(';'))
	{
		cout<<"Znak "<<char(241)<<";"<<char(241)<<" jest zakazany";
		Book::wczytaj();
	}
    int dl;
    dl=jaka2.size();
	for(int i=0;i<=dl;i++)
	{
		if(int(jaka2[i])<=90)
		{
			jaka2[i]=int(jaka2[i])+32;

		}
	}
	if(jaka2!="tak"&&jaka2!="nie")
	{
		cout<<"\aMiales podac tak lub nie !!!\n";
		Book::wczytaj();
	}
	if(jaka2=="tak")
	{
		jaka=1;
	}
	else if(jaka2=="nie")
	{
		jaka=0;
	}
	else
	{
		cout<<"\aOpcja nie poprawna!!!"<<endl;
		Book::wczytaj();
		Book::sprawdz();
		Book::zapisz();
	}

}
Book::zapisz()
{
	fstream plik;
	plik.open("Ksiazki.csv", ios::out | ios::app);
	plik<<jaka<<';'<<tytul<<';'<<autor<<';'<<ilosc_stron<<endl;
	plik.close();
}
Book::sprawdz()
{
	if(ilosc_stron<0)
	{
		system("cls");
		cout<<"\aIlosc stron nie moze byc ujemna\n\n";
		Book::wyswietl();
		Book::wczytaj();
		Book::sprawdz();
		Book::zapisz();
	}
	if(!ilosc_stron)
	{
		ilosc_stron=0;
		cout<<"\aPodana ilosc stron nie jest liczba\n";
		exit(0);
	}
	int tytul_d, autor_d;
	tytul_d=tytul.size();
	autor_d=autor.size();

	if(tytul_d>150||autor_d>150)
	{
		system("cls");
		cout<<"\aAutor lub Tytul jest zadlugi limit znakow to 150\n\n";
		Book::wyswietl();
		Book::wczytaj();
		Book::sprawdz();
		Book::zapisz();
	}
}
Book::usuwanie()
{
    int numer;
	cout<<"Podaj numer ksiazki ktora chcesz usunac ";
	cin>>numer;
	numer--;
	if(numer<0)usuwanie();
	fstream plik;
	if(decyzja==true)plik.open("Ksiazki.csv", ios::in);
	if(decyzja==false)plik.open("ranking.csv", ios::in);
    string linia[1000];
	int i=0;
	while(getline(plik, linia[i]))
	{
		if(linia[i]=="")continue;
		else i++;
	}
	plik.close();
	if(decyzja==false)Book::wczytaj();
	fstream plik2;
	if(decyzja==true)plik2.open("Ksiazki.csv", ios::out);
	if(decyzja==false)plik2.open("ranking.csv", ios::out);
	for(int j=0;j<=i;j++)
	{
		if(j==numer)
		{
		cout<<"\nKsizak usunieta!!";
		if(decyzja==false)
		{
			plik2<<jaka<<';'<<tytul<<';'<<autor<<';'<<ilosc_stron<<';'<<++numer<<endl;
			j++;
		}
	}
		else plik2<<linia[j]<<endl;
	}
	plik2.close();
}
Book::wyszukaj() ////Niegotowe//////
{
	string podane;
	cout<<"Wpisz tytul ksiazki lub autora, aby wyszukac: ";
	cin>>podane;
	fstream plik;
	plik.open("Ksiazki.csv", ios::in);
	string line;
	while(getline(plik, line))
	{
		if(line.find(podane))
		{
			if(line.find('0'))cout<<"Ksiazka do przeczytania!!\n";
			else if(line.find('1') ) cout<<"Ksiazka przeczytana";
			cout<<line<<endl;
		}
	}
	getch();
	plik.close();
}
/// Druga klasa ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ranking::ranking(int nr)
{
	nr_pozycji=nr;
}
ranking::wczytaj()
{
	decyzja=false;
	Book::wczytaj();
	cout<<"Podaj numer ksiazki w ranking: ";
	cin>>nr_pozycji;
}
ranking::sprawdz()
{
	decyzja=false;
	Book::sprawdz();
	if(nr_pozycji<1||nr_pozycji>10)
	{
		void ranking_ksiazek();
	}
}
ranking::zapisz()
{
	fstream plik;
	plik.open("ranking.csv", ios::out|ios::app);
	plik<<jaka<<';'<<tytul<<';'<<autor<<';'<<ilosc_stron<<';'<<nr_pozycji<<endl;
	plik.close();
}
ranking::zapisz2()
{
	fstream plik;
	plik.open("ranking.csv", ios::out);
	plik<<jaka<<';'<<tytul<<';'<<autor<<';'<<ilosc_stron<<';'<<nr_pozycji<<endl;
	plik.close();
}
ranking::wyswietl()
{
	system("cls");
	decyzja=false;
	Book::wyswietl();
}
ranking::usuwanie()
{
	decyzja=false;
	Book::usuwanie();
}

Przepraszam jak coś źle lub za mało podałem.

Proszę o pomoc!!!

1 odpowiedź

+2 głosów
odpowiedź 27 października 2019 przez adrian17 Mentor (355,240 p.)
wybrane 27 października 2019 przez Wiktor Michalski
 
Najlepsza

Po pierwsze, same definicje metod są błędne:

<source>:8:25: error: ISO C++ forbids declaration of 'wczytaj' with no type [-fpermissive]
         virtual wczytaj();

Po drugie, hierarchia klas ma mało sensu.

class ranking: public Object, public Book

Ranking jest książką (???). Książka jest obiektem. Więc dwukrotnie dziedziczysz po Obiekcie; kompilator ostrzega że to pierwsze dziedziczenie jest dziwne i nie zadziała tak jak myślisz.

EDIT: z bocznych uwag:

- nie używaj exit(0)

- zamiast deklarować wszystkie zmienne na górze funkcji, rób to przy miejscu faktycznego użycia; wtedy trochę kod się uprości

- zamiast ręcznego ios::out, .open(), .close() używaj ifstream/ofsream, ich konstruktory i destruktory

- czemu przekazujesz wartości jak 'decyzja' przez pola klasy bazowej, a nie po prostu argumentami funkcji?

- linia 257 'void ranking_ksiazek();' nic nie robi; tak się nie wywołuje funkcji.

- rekurencja w book::usuwanie() raczej nie zrobi tego co myślisz ;)

- (projektowo: czemu w ogóle książka wie, jak edytować plik ze zbiorem książek i rankingiem?)

komentarz 27 października 2019 przez Wiktor Michalski Początkujący (430 p.)
Dzięki za wszystkie uwagi!!

Widzę, że ten projekt jest całkowicie źle zaprojektowany i zastosuje się do twoich uwag. Na tym projekcie uczyłem się całego programowania obiektowego więc wyszła z tego wybuchowa mieszanka. Jeszcze raz dzięki!

Podobne pytania

+1 głos
0 odpowiedzi 2,698 wizyt
0 głosów
1 odpowiedź 381 wizyt
0 głosów
3 odpowiedzi 1,441 wizyt

93,778 zapytań

142,737 odpowiedzi

323,388 komentarzy

63,382 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...