Forum huvudsida -> Programmering -> C++: Hjälp med en övning, någon?
Nissebosselasse | 17:49 - 25:e Juli 2006 | Post #26 | |
Medlem Inlägg: 490 Skicka PM |
Tja, this är ju (vad jag vet) det enda sättet för klassen att få tag på instansen av "sig själv", så att säga. Användningsområdena är väl oändliga (beroende på problemlösningen), och du såg ju hur lätt det gick att lösa kloningsproblemet ovan med hjälp av this-pekaren. Fundera lite på hur du skulle löst det utan this... I din förra post skrev du:
Jag antar att du var för snabb på tangenterna på den sista (this->.The...), eftersom det inte ska vara någon punkt efter ->. Nu ska jag äta Corn Flakes! ------------------------- http://pushingcows.se Gula Nallen |
olle | 17:57 - 25:e Juli 2006 | Post #27 | |
Medlem Inlägg: 57 Skicka PM |
stämmer mycket väl att jag råkade ta med punkt för mycket Verkar som jag börjar förstå lite grann vad this är och hur den fungerar. Innan var jag lite borta När man ska göra Destruktorn. Måste jag göra för alla klasser? Sen undrar jag varför Shapes Destruktorn måste vara virtual. För i övningen säger den utan virtual så anropas inte ~Group() för gruppobjekt som pekas ut av Shape pekaren? Blir nästan lite sugen på corn flakes nu när du nämner det ------------------------- Ingen signatur! |
Nissebosselasse | 18:27 - 25:e Juli 2006 | Post #28 | |
Medlem Inlägg: 490 Skicka PM |
Här är en bra förklaring på frågan: http://www.codersource.net/cpp_virtual_destructors.html Lite off-topic: jag reagerar varje gång jag skriver/läser orden konstruktor / destruktor. De är ju uppenbarligen direkt tagna från engelskans "constructor" / "destructor". Borde man inte istället på svenska säga "konstruktör" och...tja..."förgörare"? EDIT: Det smakade väldigt bra med Corn Flakes, men nu väntar något ännu bättre: kaffe! ------------------------- http://pushingcows.se Gula Nallen Senast redigerad 18:28 - 25:e Juli 2006 |
olle | 19:11 - 25:e Juli 2006 | Post #29 | |
Medlem Inlägg: 57 Skicka PM |
Var en bra föklaring till det som jag ej förstog, tack för länken. Håller med dig att översättningen från engelska till svenska är lite fel. Brukar även ibland vara fel när dom översätter en film title som ska visas på tv. Ibland vet man inte ens vilken film det är förran man har sett lite i början. Har nu försökt göra Destruktorn ( förgörare ) för Group.
Ser väl bra ut? Kan säga att jag nästan aldrig definerar destruktor. Lite dålig med det. Sen när jag tänkte göra ~Shapes() så blev det lite stopp där. Samma sak med Circle och resterande. Vad är de jag ska "delete"? Jag föredrar te framför kaffe. Har väl blivit en vana ------------------------- Ingen signatur! Senast redigerad 19:22 - 25:e Juli 2006 |
olle | 19:38 - 25:e Juli 2006 | Post #30 | |
Medlem Inlägg: 57 Skicka PM |
såg att det var lite kompileringsfel. Men andå efter det fick jag Segmentfault eller va de heter. och SEGABRT
Synd att man inte kan slippa Destruktorn heh ------------------------- Ingen signatur! |
Nissebosselasse | 20:27 - 25:e Juli 2006 | Post #31 | |
Medlem Inlägg: 490 Skicka PM |
När du klonar ett Group-objekt, så kopieras listan med Shape-pekare (TheShapeList) från det ena objektet till det andra. Så fastän du har enskilda Group-objekt, så innerhåller deras lista (TheShapeList, som sagt) samma lista med pekaradresser. Du har lagt in i "förgöraren" (destruktorn ) för Group-klassen, att varje pekaradress i listan ska tas bort med delete, när Group-objektet själv förstörs (vid programmets slut, exempelvis), vilket är helt rätt. Men detta sker ju för varje instans av Group-objektet, och eftersom alla Group-kloner har samma lista med pekaradresser, kommer nästa Group-objekt/klon att ha en lista med felaktiga pekaradresser (eftersom de har blivit borttagna av en annan Group-klon). Om de nästföljande klonerna bara vill ta bort/rensa sin lista (med delete), så är det inga problem; att köra delete på en tidigare borttagen pekare, orsakar inga fel. Men om någon klon vill använda objekten i sin lista (via t.ex. TheShapeList[i]->move (10, 10)), så kommer ju den pekaradressen att vara ogiltig. Hoppas det inte blev för rörigt... ------------------------- http://pushingcows.se Gula Nallen |
olle | 20:50 - 25:e Juli 2006 | Post #32 | |
Medlem Inlägg: 57 Skicka PM |
Blev lite rörigt, men förstår vad du menar. Men hur ska man unvika detta? För det finns bara TheShapeList som man har access till när man ska definera Destruktorn? Har ju sett att man i samma funktion som man allokerar så deallokera man oxo. Man gör en test innan etc.. Ska man delete i clone kanske? Eller så är jag helt borta. ------------------------- Ingen signatur! Senast redigerad 20:50 - 25:e Juli 2006 |
Nissebosselasse | 21:00 - 25:e Juli 2006 | Post #33 | |
Medlem Inlägg: 490 Skicka PM |
Man kan ju, istället för att kopiera de rena pekaradresserna (som du gör nu, med push_back), skapa nya instanser av Shape-objekten i listan för varje ny instans av Group-klonen (jag antar att det är så övningen är tänkt att lösas). Detta förutsätter att kopieringskonstruktören ( ) för Shape-klassen fungerar... Detta är ett bara ett snabbt svar, återkommer med mer när jag testat själv (sitter och skriver på andra saker nu...)! ------------------------- http://pushingcows.se Gula Nallen |
olle | 21:17 - 25:e Juli 2006 | Post #34 | |
Medlem Inlägg: 57 Skicka PM |
Har ingen kopieringskonstruktor i shape vad jag vet.
Tanken i uppgiften är att en grupp kan tex innehålla en ellipse, två rektanglar eller varför inte en annan delgroup med cirklar och kvadrat. Sen när man gör klone så ska väl allt som finns i just group objektet klonas. dvs allt i vectorn av typen Shape*. Här finns frågan ifall jag föklarat dåligt http://img228.imageshack.us/img228/6748/groups1oz8.jpg http://img157.imageshack.us/img157/6586/groups2qj0.jpg Har ingen brådska, så de e lungt. ------------------------- Ingen signatur! |
Nissebosselasse | 21:45 - 25:e Juli 2006 | Post #35 | |
Medlem Inlägg: 490 Skicka PM |
Okej, så här löste jag det: istället för att trycka dit pekaradresserna, så anropar jag clone hos varje Shape-instans i listan, och lägger till returvärdet från den funktionen (Shape *Clone () const). Kloningsfunktionen hos Shape-klassen blev precis som den hos Group-klassen:
Konstruktören får en parameter (som förväntas), så att den kan skapa en instans som visserligen är unik (den skapas ju med new), men som ändå får samma värde eftersom det kopieras (m_number). Alltså, konstruktören hos din Shape-klass tar ju också ett antal parametrar (Shape (QWidget *aWidget,const char *n,QColor c,Point p);), som i sin tur sätter dessa värden för klassen. Det är samma princip som mitt exempel ovan. Jag märker att mina förklaringar blir mer och mer röriga, så jag ska försöka ladda upp hela min källkod i en zip-fil nu (det ska väl gå här om jag inte minns fel...). Det är oftast lättare att själv stega igenom hela källkoden än att lyssna på någon som försöker förklara den... Observera som jag sagt innan: det går naturligtvis inte att bara klippa och klistra in min källkod i ditt projekt. Men du ser ju i alla fall tekniken jag använt. EDIT: så där, laddade upp det som "shape.zip" under min användarprofil (tror jag det ska finnas...). EDIT2: hmm, verkar inte finnas där, men den är ändå uppladdad...? Jaja, den finns här också: http://pushingcows.se/shape.zip ------------------------- http://pushingcows.se Gula Nallen Senast redigerad 21:54 - 25:e Juli 2006 |
olle | 01:07 - 26:e Juli 2006 | Post #36 | |
Medlem Inlägg: 57 Skicka PM |
Har nu gjort ändringarna så att i group copykonstruktorn så anropar den clone för just den objekt typ som berör så att säga.
Sen har jag redan alla mina clone funktioner i ellipse, rektangle, cirkel etc redan såsom din princip.
Och dom resterande clone funktioner är desamma fast skillnaden Circle(theWidget,myName,myColor,myPos,myRadius); Ellipse(theWidget,myName,myColor,myPos,myXradius,myYradius); etc.. I shape::clone() skulle man ej använda utan den är rent virtuel pga att det finns inget där som ska ritas (draw). Sist men inte minns i Group::clone() är det som vanligt som du visat.
Och det verkar som det fungerar, får ingen segment fault eller SIGABRT. Kanske var onödigt och visa vad jag gjorde när det andå fungerar. Tänkte kanske någon annan ville veta det. Så nu behöver jag ej definera "virtual ~Shape(){} och för Circle, Ellipse etc? För allt sköts nu via Groups destruktorn, stämmer det? Tack för att du orkar stå ut med mig med alla mina dumma frågor Kanske dags och sova nu, börjar bli sent. Ps: Du föklarar väldigt bra. Behövde inte gå igenom din kod för och förstå vad du menar. Edit: Glömde visa hur Destruktorn för Group ser ut ifall någon undrar.
------------------------- Ingen signatur! Senast redigerad 01:09 - 26:e Juli 2006 |
Nissebosselasse | 10:06 - 26:e Juli 2006 | Post #37 | |
Medlem Inlägg: 490 Skicka PM |
Eftersom alla klasser ärver från Shape, så ska basklassens "förgörare" (destruktor) vara virtuell; dom andra ärvda klassernas förgörare behöver inte vara virtuella (såvida du inte tänkt ärva från dom i sin tur). Det är bara för att garantera att basklassens förgörare anropas vid delete. Och egentligen, det är ju inte svårare än att skriva virtual ~Shape () {}...och då kan man ju lika gärna göra det Vad bra att det löste sig! Nu ska jag äta frukost... ------------------------- http://pushingcows.se Gula Nallen |
olle | 13:41 - 26:e Juli 2006 | Post #38 | |
Medlem Inlägg: 57 Skicka PM |
Tack för informationen Tänkte bara påpeka att virtualiteten ärvs även om om en tredje klass ärver.
Kan säga att utan dig hade jag ej löst denna övning. Tack för all hjälp och ork Ha de gött tills kanske kommer med nåt annat nytt ------------------------- Ingen signatur! |
Forum huvudsida -> Programmering -> C++: Hjälp med en övning, någon?
Du får inte posta i den här tråden | Till toppen
Datum
2024-05-03 08:07
Vecka: 18
Besökare
Inloggade: 0
Gäster: 605
Medlemmar
Medlemmar: 53576
Forum
Senaste inlägget: HAHA MÄNNISKAN LEVER ÄN (13:45 - 18:e Januari 2019, av Hetzz)
Wiki
Senaste ändringen:
3D (rev: 1, tid: 09:40 - 13:e November 2015)
Chatt
#blinkenlights @ Libera.Chat
Gratis shellkonton för IRC, webbsidor mm.