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

Permalänk
Medlem

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

Visa signatur

LG OLED77CX • Intel i9 10900K @ 5.0GHz • Noctua NH-D15 • ASUS Strix Z490-H • Corsair 32GB DDR4 3200MHz • GIGABYTE RTX 4080 • Phanteks Evolv X • Corsair RM 850W V2

Permalänk
Hedersmedlem

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(); }

Permalänk
Medlem

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; // ...?

Visa signatur

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

Permalänk
Medlem

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?)

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Hedersmedlem
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/

Permalänk
Medlem
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

Visa signatur

LG OLED77CX • Intel i9 10900K @ 5.0GHz • Noctua NH-D15 • ASUS Strix Z490-H • Corsair 32GB DDR4 3200MHz • GIGABYTE RTX 4080 • Phanteks Evolv X • Corsair RM 850W V2

Permalänk
Medlem

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...

Visa signatur

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

Permalänk
Hedersmedlem
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; }

Permalänk
Medlem
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.

Visa signatur

LG OLED77CX • Intel i9 10900K @ 5.0GHz • Noctua NH-D15 • ASUS Strix Z490-H • Corsair 32GB DDR4 3200MHz • GIGABYTE RTX 4080 • Phanteks Evolv X • Corsair RM 850W V2