Permalänk
Medlem

[C++] Arv

Hejsan!

Jag har en uppgift här som jag har lite strul med:

Citat:

Du skall skapa en abstrakt basklass med namnet Figur.
Denna klass skall ha tre publika & rent virtuella medlemsfunktioner

float getOmkrets() // Beräknar och returnerar figurens omkrets
float getArea() // Beräknar och returnerar figurens area
string getFigureName() // Returnerar figurens namn som sträng t.ex. ”cirkel”

Skapa sedan tre klasser Cirkel, Triangel & Rektangel som alla tre skall ha ett publikt arv av Figur.
Alla tre klasserna måste givetvis definiera de tre virtuella funktionerna från basklassen.
Dessutom skall alla tre ha både konstruktor & destruktor.

Cirkel-klassen skall ha en protected medlemsvariabel med namnet radie.
Cirkel-klassen skall ha en enda konstruktor som tar en inparameter av typen float och tilldelar
radien inparameterns värde i parameterlistan.

Triangel-klassen skall ha tre protected medlemsvariabler med namnen bas, hojd & origo.
Triangel-klassen skall ha en enda konstruktor som tar tre inparametrar av typen float och tilldelar
bas, hojd & origo inparametrarnas värden i parameterlistan.

Rektangel-klassen skall ha två protected medlemsvariabler med namnen bredd & hojd.
Rektangel-klassen skall ha en enda konstruktor som tar två inparametrar av typen float och tilldelar
bredd och hojd inparametrarnas värden i parameterlistan.

Skapa ytterligare en klass med namnet Kvadrat som ärver (publikt) från klassen Rektangel.

Kvadrat-klassen skall inte ha några medlemsvariabler alls.
Kvadrat-klassen skall ha en enda konstruktor som tar en inparameter av typen float.

I Kvadrat-konstruktorns parameterlista skall ett anrop av Rektangel-konstruktorn (med två
inparametrar) göras, skicka inparametern som både bredd & höjd.
Kvadrat-klassen skall dessutom innehålla en medlemsfunktion som dynamiskt (med new) skapar ett
Cirkel-objekt som har största möjliga radie men som ändå kan få plats inne i kvadraten,
funktionen skall sedan returnera en pekare till detta Cirkel-objekt.
Cirkel* getInnerCirkel().

Vad jag kommit fram till:
main.cpp

#include "Figur.h" #include "Cirkel.h" #include "Rektangel.h" #include "Kvadrat.h" #include "Triangel.h" #include <iostream> #include <string> using namespace std; int main () { Cirkel *c = new Cirkel(3.2); // testa att skapa ett cirkel-objekt delete c; return 0; }

figur.h

#pragma once #include <string> using namespace std; class Figur { public: virtual float getOmkrets(); virtual float getArea(); virtual string getFigureName(); };

cirkel.h

#pragma once #include "Figur.h" class Cirkel : public Figur { public: Cirkel(float r); ~Cirkel(); protected: float radie; };

cirkel.cpp

#include "Cirkel.h" Cirkel::Cirkel(float r) : radie(r) { } Cirkel::~Cirkel() { } float getOmkrets() { return 3.14 * /* * radie * */ 2; // vill kunna använda min protected "radie" här för att returnera omkretsen } float getArea() { return 3.2; } string getFigureName() { return "Cirkel"; }

rektangel.h

#pragma once #include "Figur.h" class Rektangel : public Figur { public: Rektangel(float b, float h); ~Rektangel(); protected: float bredd; float hojd; };

rektangel.cpp

#include "Rektangel.h" Rektangel::Rektangel(float b, float h) : bredd(b), hojd(h) { } Rektangel::~Rektangel() { } float getOmkrets() { return 3.14 * 2; // test } float getArea() { return 3.2; } string getFigureName() { return "Rektangel"; }

triangel.h

#pragma once #include "Figur.h" class Triangel : public Figur { public: Triangel(float b, float h, float o); ~Triangel(); protected: float bas; float hojd; float origo; };

triangel.cpp

#include "Triangel.h" Triangel::Triangel(float b, float h, float o) : bas(b), hojd(h), origo(o) { } Triangel::~Triangel() { } float getOmkrets() { return 3.14 * 2; // test } float getArea() { return 3.2; } string getFigureName() { return "Triangel"; }

Felen jag får:

1>c:\users\*********\desktop\uppgift1\uppgift1\cirkel.cpp(18): warning C4305: 'return' : truncation from 'double' to 'float' 1>c:\users\**********\desktop\uppgift1\uppgift1\cirkel.cpp(24): warning C4305: 'return' : truncation from 'double' to 'float' 1>Rektangel.obj : error LNK2005: "float __cdecl getOmkrets(void)" (?getOmkrets@@YAMXZ) already defined in Cirkel.obj 1>Rektangel.obj : error LNK2005: "float __cdecl getArea(void)" (?getArea@@YAMXZ) already defined in Cirkel.obj 1>Rektangel.obj : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl getFigureName(void)" (?getFigureName@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) already defined in Cirkel.obj 1>Triangel.obj : error LNK2005: "float __cdecl getOmkrets(void)" (?getOmkrets@@YAMXZ) already defined in Cirkel.obj 1>Triangel.obj : error LNK2005: "float __cdecl getArea(void)" (?getArea@@YAMXZ) already defined in Cirkel.obj 1>Triangel.obj : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl getFigureName(void)" (?getFigureName@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) already defined in Cirkel.obj 1>Cirkel.obj : error LNK2001: unresolved external symbol "public: virtual float __thiscall Figur::getOmkrets(void)" (?getOmkrets@Figur@@UAEMXZ) 1>Kvadrat.obj : error LNK2001: unresolved external symbol "public: virtual float __thiscall Figur::getOmkrets(void)" (?getOmkrets@Figur@@UAEMXZ) 1>Rektangel.obj : error LNK2001: unresolved external symbol "public: virtual float __thiscall Figur::getOmkrets(void)" (?getOmkrets@Figur@@UAEMXZ) 1>Triangel.obj : error LNK2001: unresolved external symbol "public: virtual float __thiscall Figur::getOmkrets(void)" (?getOmkrets@Figur@@UAEMXZ) 1>Cirkel.obj : error LNK2001: unresolved external symbol "public: virtual float __thiscall Figur::getArea(void)" (?getArea@Figur@@UAEMXZ) 1>Kvadrat.obj : error LNK2001: unresolved external symbol "public: virtual float __thiscall Figur::getArea(void)" (?getArea@Figur@@UAEMXZ) 1>Rektangel.obj : error LNK2001: unresolved external symbol "public: virtual float __thiscall Figur::getArea(void)" (?getArea@Figur@@UAEMXZ) 1>Triangel.obj : error LNK2001: unresolved external symbol "public: virtual float __thiscall Figur::getArea(void)" (?getArea@Figur@@UAEMXZ) 1>Cirkel.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Figur::getFigureName(void)" (?getFigureName@Figur@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) 1>Kvadrat.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Figur::getFigureName(void)" (?getFigureName@Figur@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) 1>Rektangel.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Figur::getFigureName(void)" (?getFigureName@Figur@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) 1>Triangel.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Figur::getFigureName(void)" (?getFigureName@Figur@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)

Hjälp...

Tack på förhand!

Permalänk
Medlem

Du måste skriva

float getOmkrets() { return 3.14 * 2; // test }

till

float Rektangel::getOmkrets() { return 3.14 * 2; // test }

Osv. i varje cpp fil, Det borde fixa dom flesta "unresolved external symbol" och "already defined in"
Det är för att ange att dom tillhör klassen och inte är lösa funktioner.

förtydliganden
Visa signatur

orka

Permalänk
Medlem
Skrivet av miffo:

du måste skriva

float Triangel::getOmkrets()
float Rektangel::getOmkrets()

osv. borde fixa dom flesta unresolved external symbol och already defined in XX

Testade det, fick error "inherited member is not allowed".

Permalänk
Medlem

du måste nog göra Figur polymorfisk? osäker dock om det är de,
lägg till en virtuel destructor på figur

Visa signatur

orka

Permalänk
Medlem
Skrivet av miffo:

du måste nog göra Figur polymorfisk? osäker dock om det är de,
lägg till en virtuel destructor på figur

Fortfarande fel :/
Känns som att läraren försöker vilseleda mig på något sätt

Permalänk
Medlem
Skrivet av linuxe93:

Du skall skapa en abstrakt basklass med namnet Figur.

du ska nog sätta alla figur funktioner till =0; också för att det ska vara en abstrakt klass

Visa signatur

orka

Permalänk
Medlem

Löste det!
Tack så mycket för hjälpen!

Permalänk
Medlem

Du måste fortfarande deklarera funktionerna i klass deklarationen.

Visa signatur

orka