[C++] Arv
Hejsan!
Jag har en uppgift här som jag har lite strul med:
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!