No default constructor exist for class Rhombus

0

Header

class Polygon
{
public:
	virtual float perimiter() = 0;
	virtual float area() = 0;
	virtual void hasGreaterArea(Polygon *wsk) = 0;
};

class Rhombus :public Polygon
{
public:
	Point a, b, c, d;
	Rhombus(Point, Point, Point, Point);
	float perimiter() override;
	float area() override;
	void hasGreaterArea(Polygon *) override;
};

class Square :public Rhombus
{
public:
	Point a, b, c, d;
	Square(Point, Point, Point, Point);
	float perimiter();
	float area();
	void hasGreaterArea(Polygon *);
};

cpp

Rhombus::Rhombus(Point p1, Point p2, Point p3, Point p4) :a(p1), b(p2), c(p3), d(p4)
{}


Square::Square(Point p1, Point p2, Point p3, Point p4) :a(p1), b(p2), c(p3), d(p4)
{} // Tu wyskakuje blad: No default constructor exist for class Rhombus

Czym to jest spowodowane skoro wydaje mi się, że nie potrzebuje domyślnego konstruktora Rhombus?

1

Nie potrzebujesz, ale wypadałoby w takim razie go nie próbować używać.

Square::Square(Point p1, Point p2, Point p3, Point p4) :a(p1), b(p2), c(p3), d(p4)
{}

Jak myślisz, z jakiego konstruktora Rhombus korzystasz, aby zainicjalizować obiekt nadrzędny, będący częścią składową Square, skoro nie podajesz mu żadnych parametrów?

Square::Square(Point p1, Point p2, Point p3, Point p4) : Rhombus(p1, p2, p3, p4), a(p1), b(p2), c(p3), d(p4)
{}

Tylko to się mija z celem, bo przesłaniasz wszystkie punkty, a w kwadracie punkty i tak nie ma sensu trzymać czterech punktów, gdy wystarczą dwa.

0

Czyli wystarczy dodać konstruktor?

Rhombus(){};
0

Jak chcesz to zrobić źle to tak. Lepsze rozwiązania to np. zamiast duplikować pola o tej samej nazwie, nie duplikuj ich i używaj tych z Rhombus. Bo teraz jak podasz kwadrat do funkcji oczekującej rombu to będziesz miał UB.

0

Czyli poprawnym było by zrobić to tak?

Square::Square():Rhombus(Point p1,Point p2,Point p3,Point p4), a(p1), b(p2), c(p3), d(p4)
{}
0

Przecież to się nawet nie skompiluje. Dostałeś w moim poście powyżej jak to zrobić, tylko powinieneś jeszcze wywalić a,b, c, d z kwadratu, bo są tam zbędne.

0

Dobrze bo moim problemem jest fakt, że:

Ponieważ kwadrat jest zarówno rombem jak i prostokątem, to klasa Square ma dziedziczyć zarówno po klasie Rhombus jak i klasie Rectangle.

Wówczas:

Square::Square(Point p1, Point p2, Point p3, Point p4) : Rhombus(p1, p2, p3, p4), a(p1), b(p2), c(p3), d(p4): Rectangle(p1, p2, p3, p4), a(p1), b(p2), c(p3), d(p4); 

Będzie niejednoznaczne, bo z której klasy Square ma dziedziczyć te punkty?

1

Możesz zrobić sobie piękny diamond inheritance i zarówno romb jak i prostokąt podziedziczyć wirtualnie po Qadrilateral, który by miał te punkty.

0

Niestety to zadanie na studia, które musi być akurat tak rozwiązane. Normalnie dziedziczyłbym wirtualnie po Polygonie. Więc w takim przypadku zostaje tylko błędne:

Rhombus(){};

Inaczej nie rady?

0

Nie znam treści zadania, ale postaraj się zrobić tak, aby przekazując kwadrat do funkcji przyjmującej romb/prostokąt, miała ona poprawne dane. W tym przypadku tak nie będzie.

0

Dobra dzięki w takim razie, już wystarczająco czasu Ci zmarnowałem :)

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