C++ Arv - Cylinder -> Cirkel - Behöver hjälp!

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Dec 2003

C++ Arv - Cylinder -> Cirkel - Behöver hjälp!

Hej allesammans!

Hittade en arv uppgift när jag sökte runt på nätet efter C++ övningar och behöver hjälp med att lösa den, om någon skulle kunna skriva koden skulle det vara otroligt schysst, behöver få en inblick i C++ världen då jag är nybörjare

En cylinder kan uppfattas som en cirkel med höjd, dvs man kan låta den ärva från en cirkel. Skapa en sådan klass, Cylinder, utgående från klassen Circle nedan.

class Circle {
public:
Circle(double r=0) : radius(r) {}
double getArea() const;
double getRadius() const { return radius; }
private:
double radius;
};
// Implementering av medlemsfunktioner:
double Circle::getArea() const {
return 3.1416*radius*radius;
}

Förutom en konstruktor, som har cirkelns radie och cylinderns höjd som parametrar, ska klassen ha följande medlemsfunktioner: getVolume() som returnerar cylinderns volym samt getHeight() som returnerar cylinderns höjd.
Skriv en main-funktion som testar Cylinder-klassen.

/Sanazin

i7 4790K @ 5.0 GHz 24/7 • Noctua NH-D15 • Gigabyte Z97X-SLI • Crucial 2x8GB DDR3 9-9-9-24 • ASUS ROG STRIX Geforce 1080 GTX @ 2075MHz Core • Samsung 24" SM2443 + Philips 220CW 22" • X-Fi XtremeMusic • CM HAF X • Fractal Design Integra R2 750W

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004

Varför inte till exempel

class Cylinder: public Circle { public: Cylinder(double r, double h): Circle(r), height(h) {} double getVolume() const; double getHeight() const {return height;} private: double height; }; double Cylinder::getVolume() const { return height*getArea(); }

Trädvy Permalänk
Medlem
Registrerad
Dec 2004

Heh, precis som skrivet på ett annat forum så är denna sorts arv ett klassexempel på "pedagogisk dumhet". Man försöker visa ett bra exempel på arv... men vad man istället visar är ett fall då man inte ska använda arv. En "Circle bas" som medlemsvariabel är från en design-synpunkt troligtvis mest rimlig här.

Elgot's exempel är den klassiska lösningen, men om man tänker efter, vad händer om vi nu anropar:

Cylinder c; cout << c.getArea() << endl; // ...?

"Nothing is impossible because impossible itself says I M Possible..."

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

Man får cirkelns area för att klass Cylinder inte har överlagrat?
(C++ verkar kul! offtopic: Tips om ett bra startpaket med kompilator för W32?)

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av Teknocide
Man får cirkelns area för att klass Cylinder inte har överlagrat?

Ja, men exemplet är som sagt lite dåligt då det inte är så mycket mer än radien objekten har gemensamt.

Citat:

Ursprungligen inskrivet av Teknocide
(C++ verkar kul! offtopic: Tips om ett bra startpaket med kompilator för W32?)

Det är förmodligen visual c++ express du vill ha.
http://www.microsoft.com/express/vc/

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Dec 2003
Citat:

Ursprungligen inskrivet av Elgot
Varför inte till exempel

class Cylinder: public Circle { public: Cylinder(double r, double h): Circle(r), height(h) {} double getVolume() const; double getHeight() const {return height;} private: double height; }; double Cylinder::getVolume() const { return height*getArea(); }

Tror jag förstår någorlunda, i denna kod har du alltså med:

* Konstruktor - Cirkelns radie och höjd som parametrar?
* getVolume() och getHeight() ser jag att de finns med fast jag hade ingen aning att de ser på detta sätt

I så fall, hur skulle en main-funktion (antar att detta är helt enkelt ett funktion som fungerar som en program som ser att koden fungerar?) se ut? ^^

Tack allesammans för hjälpen! Man lär sig en del =P

i7 4790K @ 5.0 GHz 24/7 • Noctua NH-D15 • Gigabyte Z97X-SLI • Crucial 2x8GB DDR3 9-9-9-24 • ASUS ROG STRIX Geforce 1080 GTX @ 2075MHz Core • Samsung 24" SM2443 + Philips 220CW 22" • X-Fi XtremeMusic • CM HAF X • Fractal Design Integra R2 750W

Trädvy Permalänk
Medlem
Registrerad
Dec 2004

int main() { // Skapa ett cylinder-objekt med en viss radie och höjd. // Anropa getVolume(), getHeight() och getRadius() och skriv ut dem. // Räkna för hand och jämför om dem värdena är samma eller inte. // Upprepa koden ovan med andra radier och höjder. return 0; }

Hur exakta koden ska se ut bör du nog klura ut själv. Jag föreslår att du skaffar dig en någorlunda vettig grundläggande bok om C++.

Mer hjälp med en skoluppgift, övning eller ej, tror jag inte är så passande...

"Nothing is impossible because impossible itself says I M Possible..."

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av Sanazin
Tror jag förstår någorlunda, i denna kod har du alltså med:

* Konstruktor - Cirkelns radie och höjd som parametrar?
* getVolume() och getHeight() ser jag att de finns med fast jag hade ingen aning att de ser på detta sätt

Ja. Det kan vara värt att notera att man får välja om man vill definiera funktionerna direkt vid deklarationen (som till exempel getRadius()) eller senare (som getArea()).

Citat:

Ursprungligen inskrivet av Sanazin
I så fall, hur skulle en main-funktion (antar att detta är helt enkelt ett funktion som fungerar som en program som ser att koden fungerar?) se ut? ^^

Bland de enklare är nog

#include <iostream> using namespace std; int main() { Cylinder c(2, 4); cout << "Radie: " << c.getRadius() << endl; cout << "Basarea: " << c.getArea() << endl; cout << "Höjd: " << c.getHeight() << endl; cout << "Volym: " << g.getVolume() << endl; return 0; }

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Dec 2003
Citat:

Ursprungligen inskrivet av Weeblie
Hur exakta koden ska se ut bör du nog klura ut själv. Jag föreslår att du skaffar dig en någorlunda vettig grundläggande bok om C++.

Mer hjälp med en skoluppgift, övning eller ej, tror jag inte är så passande...

Tack för att du påpekar saker och ting men låt Mig bestämma hur Jag vill lära mig Weeblie, om du inte vill hjälpa till behöver du inte skriva här, PM funkar lika bra

Citat:

Ursprungligen inskrivet av Elgot
Bland de enklare är nog

#include <iostream> using namespace std; int main() { Cylinder c(2, 4); cout << "Radie: " << c.getRadius() << endl; cout << "Basarea: " << c.getArea() << endl; cout << "Höjd: " << c.getHeight() << endl; cout << "Volym: " << g.getVolume() << endl; return 0; }

Tack så hemskt mycket! Det där förklarar en del, visste till exempel inte det där med c. och g. Jag använder för närvarande Eclipse som program med ett extern kompilator, om man har koden för Cirkel och Cylinder, hur skall man implementera det i programmet för att sedan (implementera på nytt?) använda main funktionen för att kompilera och exekvera programmet?

Tack än än gång.

Edit: Aha! Problemet löst, valde att ha allt i en och samma source file, funkar finemang tack åter igen för hjälpen.

i7 4790K @ 5.0 GHz 24/7 • Noctua NH-D15 • Gigabyte Z97X-SLI • Crucial 2x8GB DDR3 9-9-9-24 • ASUS ROG STRIX Geforce 1080 GTX @ 2075MHz Core • Samsung 24" SM2443 + Philips 220CW 22" • X-Fi XtremeMusic • CM HAF X • Fractal Design Integra R2 750W