Dziedziczenie Klasy,Pole czworokata!

0

main.cpp

#include "library.h"
#include "czworokat.h"

int main(){

	Kwadrat*kwadrat=new Kwadrat(5);
	cout<<"Pole kwadratu wynosi: "<<Kwadrat.Pole()<<endl;
return 0;
}

czworokat.h

#ifndef czworokat_H
#define czworokat_H
#include "library.h"
#include "kwadrat.h"
class Czworokat{

	protected:
		int bok1;
		int bok2;
	public:

		int getbok1();
		int getbok2();
};
#endif

kwadrat.h

#include "czworokat.h"

class Kwadrat: public Czworokat{

	public:

	int pole=0;
	Kwadrat(int a){
		bok1=a;
		bok2=a;
	}
	int Pole(){
	 	pole=a*a;
		return pole;
	}
};

Wrzucilem tutaj swoj program testowy z dziedziczenia klas, niestety jest problem taki ze nie dziala.(jest jeszcze plik z biblioteka). Co dokladnie w nim nie dziala?(Error jest taki: error: expected class-name before ‘{’ token
class Kwadrat: public Czworokat{
^
kwadrat.h11: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
int pole=0;
^
kwadrat.h: In constructor ‘Kwadrat::Kwadrat(int)’:
kwadrat.h3: error: ‘bok1’ was not declared in this scope
bok1=a;
^
kwadrat.h3: error: ‘bok2’ was not declared in this scope
bok2=a;
^
kwadrat.h: In member function ‘int Kwadrat::Pole()’:
kwadrat.h9: error: ‘a’ was not declared in this scope
pole=a*a;
^
main.cpp: In function ‘int main()’:
main.cpp41: error: expected primary-expression before ‘.’ token
cout<<"Pole kwadratu wynosi: "<<Kwadrat.Pole()<<endl;)

0

Na przyszłość cytuj konkretny błąd jaki otrzymujesz, a nie opowiadaj swoimi słowami, bo robisz to błędnie i zaciemniasz obraz. Tutaj nie debugger, a linker mówi, że nie ma definicji metod. Nie pokazałeś nigdzie definicji klasy Trapez

2

czworokat.h

#include "kwadrat.h"

Wyrzuć powyższego includa. Po pierwsze, jest zbędny. Po drugie zasada jest taka, że nie można inkludować krzyżowo, czyli plik kwadratu w pliku nagłówkowym czworokąta i plik czworokąta w pliku nagłówkowym kwadratu.

0

error: ‘Kwadrat’ was not declared in this scope
Kwadratkwadrat=new Kwadrat(5);
^
main.cpp10: error: ‘kwadrat’ was not declared in this scope
Kwadrat
kwadrat=new Kwadrat(5);
^
main.cpp22: error: expected type-specifier before ‘Kwadrat’
Kwadrat*kwadrat=new Kwadrat(5);
^
Po wywaleniu #include kwadrat.h w czworokacie mam teraz takie bledy. Jak im zaradzic bo na lekcji z dziedziczenia prowadzacy tak kazal zaimplementowac to w mainie?

1

Plik kwadrat.h musisz includować w pliku main.cpp.

0

error: expected primary-expression before ‘.’ token
cout<<"Pole kwadratu wynosi: "<<Kwadrat.Pole()<<endl;
Po zastosowaniu zinkludowania w mainia pozosta mi teraz ten jeden error. Cos zle w nim zaimplementowalem?

0

Wskaźnik do swoich metod odnosi się operatorem ->.

edit:

int main(){
 
    Kwadrat*kwadrat=new Kwadrat(5);
    cout<<"Pole kwadratu wynosi: "<<kwadrat->Pole()<<endl;
    delete kwadrat; // należy  pamiętać o posprzątaniu po sobie
return 0;
} 

albo nie stosować gołych new i delete.

0

Zastosowalem twoje delete, niestety blad jest ten sam,mam do Ciebie prosbe bo nie do konca rozumiem co napisales wczesniej z tym ze wskazniki maja inny operator? Bylbys tak dobry i rozwinal ta mysl?

0
carlosmay napisał(a):

Wskaźnik do swoich metod odnosi się operatorem ->.

edit:

int main(){
 
    Kwadrat*kwadrat=new Kwadrat(5);
    cout<<"Pole kwadratu wynosi: "<<Kwadrat->Pole()<<endl;
    delete kwadrat; // należy  pamiętać o posprzątaniu po sobie
return 0;
} 

albo nie stosować gołych new i delete.

Teraz error wskazuje na twoje zastosowanie:
expected primary-expression before ‘->’ token
cout<<"Pole kwadratu wynosi: "<<Kwadrat->Pole()<<endl;
^

1
kwadrat.Pole()

Kropki używamy w przypadku klas utworzonych na stosie:

Kwadrat kwadrat(5);

W przypadku obiektów alokowanych na stercie (przy pomocy operatora new), do pól i metod odwołujemy się przy pomocy strzałki:

kwadrat->Pole();

Błąd który masz aktualnie wynika z użycia niepoprawnej nazwy obiektu. Utworzyłeś obiekt kwadrat z małych liter i do takiego obiektu musisz się odwołać. W języku C++ kwadrat i Kwadrat to dwie różne nazwy. W Twoim przypadku Kwadrat to typ obiektu a obiektem jest kwadrat.

1

Tak w kwestii formalnej ;)

@Will332: Z Twojego kodu wynika, że jedynym czworokątem dla którego można obliczyć pole jest kwadrat ;)
Funkcja Pole powinna zostać zadeklarowana w klasie Czworokat jako wirtualna i nadpisana w klasie Kwadrat.

1

Funkcja Pole powinna zostać zadeklarowana w klasie Czworokat jako wirtualna i nadpisana w klasie Kwadrat.

nie zgodzę się, przecież pole kwadratu oblicza się dokładnie tak samo jak pole prostokąta (bok1 * bok2), po prostu w kwadracie bok1 będzie równy bok2.

Zresztą są w necie artykuły, które wyśmiewają w ogóle cały przykład i pokazują, że Kwadrat dziedziczący z Prostokąta łatwo może doprowadzić do złamania jednej z zasad obiektówki (liskov substitution principle)
https://www.google.pl/search?#q=liskov+substitution+principle+rectangle+square

1
LukeJL napisał(a):

nie zgodzę się, przecież pole kwadratu oblicza się dokładnie tak samo jak pole prostokąta (bok1 * bok2), po prostu w kwadracie bok1 będzie równy bok2.

Oczywiście masz rację. Dopadła mnie chyba jakaś pomroczność jasna ;)

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