. Det verkar som att du har blandat ihop lite saker här. Hej! Hej Niklas! Hej Daniel! Problemet är att det är för mycket kod att gå igenom på ett forum. Ett tips är att börja om, och sen plocka in kod efterhand istället. Ang. c-arrayer: tyvärr finns det människor som verkar tycka att det är en bra ide att skrämma bort folk från C++ genom att använda historiska konstruktioner... Men, men. Hej!Sv: Problem med dubbellänkade listor och arv
1. Varför använder du c-arrayer? (t.ex. "Vertex *Pol")
vector som finns i C++ är betydligt bättre, vector<Vertex> Pol
2. Försök inte implementera två olika saker på samma sätt, det är bara dumt; detta t.ex.:
Vertex & operator[](int index) { return this[index]; }
...makes no sense. (Och ja, det kan funka pga hur arrayer är implementerade, men det är helt galet upplagt...)
Men den stora frågan är ändå: Vad är det du frågar?
Det är bara massa kod...Sv:Problem med dubbellänkade listor och arv
Jag håller med Niklas här.
Vad är frågan? Är det att du inte har skrivit klassen Shape och du inte
vet hur du skall skriva den eller är problemet att du har en bugg i klassen som du inte
kan lösa?
DanielSv: Niklas
Punkt 1. ("Vertex *Pol") är ett krav, just därför.
Punkt 2. Har du rätt, mitt fel: det blev kvar från något annat, det ska bort.
Din fråga: Vad jag frågar om är
A. Hur ska jag göra en implementering med den abstrakta klassen SHAPE med arvingar Polygon, Circle osv. (allra början i original frågan) och me dessa vilkor?
B. Hur kan fixas en dubbellänkad lista (av figurerna) SHAPELIST ? Speciellt problem har varit just den länkad lista med noder. Det är alltså _INTE_ två olika uppgifter utan den länkade listan ska användas mot figurerna.
"men det är helt galet upplagt..." : hur kan det lösas, är jag öppen och framför allt _tacksam_ för alla förslag. Viktigaste är de två vilkor i början av texten i original frågan.
Tack på förhand för dina tips och förslag.Sv: Daniel
Jo, frågan kanske inte var tydligt formulärad men hoppas det klarna nu med det jag skrivit till Niklas.
Sen tror jag du har missat klassen SHAPE: den finns där, både header och implementering. Sen om det finns fel och buggar i koden (spelar ingen roll var) så är jag tacksam för påpekande, tips och förlag.
Tack på förhand.Sv:Daniel
Jag skulle börja med:
struct Vertex
{
double x, y;
Vertex(_x, _y) : x(_x), y(_y) {}
} ;
class Shape
{
public:
Vertex position;
Shape(Vertex p) : position(p) {}
virtual double area() = 0;
virtual void print() {std::cout << "Shape at (" << p.x << ", " << p.y << ")\n";}
} ;
class Circle: public Shape
{
public:
double radius;
Circle(Vertex p, double r) : Shape(p), radius(r) {}
virtual double area() { return radius*radius*pi;}
virtual void print() {std::cout << "Circle(" << p.x << ", " << p.y << "), r=" << radius <<\n";}
};
Gör sen några exempel:
Shape* s = new Circle(Vertex(3,4), 5)
s->print();
std::cout << s.area;
Så länge du nu bara arbetar med Shape* och Shape &, så räcker det.
Då gör du en ShapeList:
class ShapeNode
{
public:
Shape *s;
ShapeNode *prev, *next;
ShapeNode( Shape *_s, _ShapeNode *_prev, ShapeNode *_next) ... ;
} ;
class ShapeList
{
ShapeList() {first = 0;}
void add(const Shape &s);
void remove(const Shape &s);
ShapeNode * first;
} ;
void ShapeList::add(const Shape &s)
{
ShapeNode *tmp = first;
first = new ShapeNode(&s, tmp, 0);
tmp->prev = first;
}
void ShapeList::remove(const Shape &s)
{
//...
}
Här får du själv implementera remove, och det dessutom ett fel eftersom vi inte skapar en _kopia_ av s i ShapeList::add.
Men se till att få listan att fungera först - lägg inte till mängder av funktionalitet för att du skulle kunna behöva den någon gång.
(Sen har jag gjort det mesta public ovan. Det bör du nog ändra på...)
Sv:Daniel
Jag har skrivit lite kommentarer till koden nedan, och fixat kompileringsfel.
Men jag vill bara ge dig ett tips i för framtida kodning. Koda inkrementellt, alltså liste i taget.
Det finns inte någon anledning att skapa alla objekt på en gång. I detta exempel skulle jag ha skapat ShapeListan och Shape-objektet utan metodet som ett start. Sedan skulle jag se till att en "add" fungerar, och där efter se till att delete och flytta runt i listan fungera.
När det är klart kan man göra Shape abstrakt / virituell, och skapa rectangle och polygon.
Så se till att en sak funkar INNAN du går vidare till nästa. Jag får väl erkänna att jag ibland kan sitta och koda ett par timmmar på ett nytt projekt eller en ny del i innan jag testkompilerar, men då är det med "design" i någon form av textform än implementation, men komplex kodning som listor mm måste man ta i små steg. Men innan man har rutin på det så är det bästa att göra mindre förändingar, och räkna med att 50% av koden (om inte mer) bar är stubbar som måste skrivas om när projektet utvecklas.
Hoppas detta hjälper dig att komma vidare med projektet.
Daniel
----------------------------------------------
Jag kanske missar nått här.
Men det är fortfarande samma fel. Jag tar bara ett axplock
ShapeList.cpp :
1) Alla metoder prefix. Alla implementation i C++-syntax måste börja med klassnamn::, alltså ShapeList::
2) i metoden add står det
ShapeNode *tmp = first;
first är en ShapeList*!
3) s i ShapeNode är inte const, men add tar en const-parameter. Det kommer aldrig att gå att lägga till den som s till ShapeNode.
Det var lite andra delar som saknades för att det skulle kompilera.
Jag har justerat så att den kompilerar, och de basala delarna i listan fungerar. Jag har lite svårt att förstå vad som var fel med konstruktorn. När allt kompilerade fick jag inte några speciella fel. Men det var mycket som saknades.
Jag skickade ett email med en fungerande kod, som kompilerar och kör igenom utan krasher, jag vet inte vad du vill att den skall göra.
Daniel