Klasserna Circle, Line och Rectangle skall ha metoder för att skriva ut och beräkna arean av objekten.
Gemensamma beteenden skall samlas upp i den abstrakta överklassen klassen Shape (enligt bilden ovan) så att polymorfism genom dynamisk bindning kan erhållas (dvs. man skall kunna hantera objekten på samma sätt utan att veta om det är en cirkel, linje eller rektangel).
Lägg t.ex. en rent virtuell metod draw i klassen Shape samt implementera draw metoder i alla underklasserna som vet hur respektive figur skall skrivas. T.ex. skulle tre olika objekt kunna skrivas ut så här:
Gul linje med ändpunkterna (55, 38) och (20, 72) Blå cirkel med centrum i position (115, 75) och radien 18 Grön rektangel med hörnen i position (80, 25) och (90, 50)Det kan dessutom vara lämpligt att utnyttja din Koordinat klass (från laboration B2) för att bygga upp klasserna Circle, Line och Rectangle.
Följande skiss visar en lista som för tillfället innehåller fyra objekt ur klasserna Circle, Line och Rectangle:
Det skall finnas en metod i klassen List för att skriva ut samtliga objekten i listan. Detta görs t.ex. genom att skapa en metod draw även i klassen List som itererar över alla linkobjekt i listan och utför draw på vart och ett av de figurobjekt som pekas ut av pekarvariabeln objPtr.
Det skall finnas en metod i klassen List för att beräkna arean av samtliga objekt i listan.
Att spara figurerna på en fil är ganska enkelt, gör precis som med draw och area. Lagra exempelvis informationen på följande textbaserade filformat:
Gul 55 38 20 72 Blå 115 75 18 Grön 80 25 90 50Att hämta figurerna från en fil är något trassligare eftersom det då inte går att använda dynamisk bindning för att rätt load metod skall väljas i och med att objekternas typer inte finns lagrade på filen. För att göra detta måste man även lagra någon typ av identifiering i filen:
Förändra metoderna save så att de t.ex. skriver ut tecknen 'L', 'C' och 'R' för att markera objektens typ:
L Gul 55 38 20 72 C Blå 115 75 18 R Grön 80 25 90 50Vid inläsningen kan man nu läsa första tecknet i en rad och sedan utifrån detta skapa rätt typ av objekt:
Shape * shapePtr; instream >> tag; switch (tag) { case 'L': shapePtr = new Line; break; case 'C': shapePtr = new Circle; break; case 'R': shapePtr = new Rectangle; break; }Därefter är det bara att köra på som vanligt eftersom pekarvariabeln shapePtr nu pekar ut rätt sorts objekt och rätt load metod därmed kommer att utföras (förutsatt att den deklarerats som virtual i klassen Shape).
shapePtr->load();
Observera att du inte ska lägga in någon som helst information om vilka objekt som finns i listan i klasserna List och Link. Om man bryter mot detta blir nästa uppgift, laboration G4, omöjlig(?) att lösa på ett snyggt sätt.
Detta kan t.ex. lösas genom att man i List klassens load funktion anropar en medlemsfunktion i klassen Shape (måste vara en statisk medlemsfunktion eftersom inget objekt har skapats ännu) som: