• 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'

VPS Starter Arubacloud
0 głosów
298 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 Ekspert (344,100 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,362 wizyt
0 głosów
1 odpowiedź 272 wizyt
0 głosów
3 odpowiedzi 568 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...