kompilator nie widzi klasy

0

Witam, miałem już kiedyś podobny problem i udało mi się z nim uporać właśnie w taki sposób jak to co przedstawię poniżej w kodach, niestety teraz coś nie działa i nie widzi dalej klas...

//Empira.h
#pragma once

#include <iostream>
#include "Pizza.h"

using namespace std;
class Pizza;
class Empira: public Pizza{
public:
	Empira();
	~Empira(void);
	void OpiszPizze();
	virtual Pizza* klonuj() const;
}; 
//pizza.h
#pragma once

#include "TypPizzy.h"
#include "Empira.h"

class Pizza{
protected:
	TypPizzy tPizzy;
	Pizza(TypPizzy);
public:	

	virtual ~Pizza(void);
	virtual void OpiszPizze() = 0;
	virtual Pizza* klonuj()const = 0;
	TypPizzy ZwrocTyp() const;
};
 
//TypPizzy.h
#pragma once

enum TypPizzy{
	Empira_t,
	Margharita_t,
	Ataman_t,
	Nepalska_t,
	Tropicana_t
};

Mam jeszcze kilka klas w tym projekcie, ale nie widzę sensu wstawiania ich tutaj bo chyba nie będą potrzebne. Kompilator wyrzuca mi coś takiego:

1>ClCompile:
1>  Pizzeria.cpp
1>c:\users\lukasz\documents\moje programy\inzynieria\lab12\lab12\empira.h(8): error C2504: 'Pizza' : base class undefined
1>c:\users\lukasz\documents\moje programy\inzynieria\lab12\lab12\pizzeria.cpp(6): error C2440: '=' : cannot convert from 'Empira *' to 'Pizza *'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>  Pizza.cpp
1>c:\users\lukasz\documents\moje programy\inzynieria\lab12\lab12\empira.h(8): error C2504: 'Pizza' : base class undefined
1>  Lab12.cpp
1>c:\users\lukasz\documents\moje programy\inzynieria\lab12\lab12\empira.h(8): error C2504: 'Pizza' : base class undefined
0
class Pizza;                        // Deklaracja klasy Pizza
class Empira: public Pizza      // Nie jest wystarczająca dla dziedziczenia po niej kompilator musi już znać rozmiar klasy Pizza.
0

czyli jak załatwić ten problem aby znał rozmiar?

1

Wywalić class Pizza z pliku empira.h. Z pliku Pizza.h wywalić #include "Empira.h"

0

Po pierwsze, po co w klasie Pizza dodajesz typ pizzy? Po drugie, trzymanie typu Pizzy w globalnym enumie może doprowadzić do RTTI dla ubogich, jak normalne RTTI nie powinno być zwykle stosowane (podobnie jak goto, skomplikowane wielodziedziczenie itp.). Ogólnie prawie cała reszta programu powinna się tylko posługiwać referencjami do Pizzy, tylko w niektórych miejscach określasz typ pizzy, samo tworzenie Pizzy konkretnego typu zamknąłbym w kolejnej abstrakcji (fabryka się to chyba nazywa).

Musisz się zastanowić nad rozwiązaniem, które będzie wymagało najmniej roboty przy dodaniu innej Pizzy lub zmianie istniejącej. Może nawet kompletne zrezygnowanie z dziedziczenia będzie lepszym pomysłem, wtedy typy pizz się będą różnić po prostu wartością pól w klasie Pizza (cena, vector<skladniki>, nazwa itd.) i będą zdefiniowane zewnętrznie.

0

Chciałem zrobić analogicznie do takiego schematu który był na ćwiczeniach, żeby się zbytnio nie wysilać bo nie ma czasu. Widzę jednak, że chyba będę musiał się nieco wysilić, a schemat klas na którym się wzoruje jest w załączniku

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