Article View: be.comp.programming
Article #8672Re: [C++]: copy constructor en LIFO lijst
From: Bart.Vanhauwaert
Date: Tue, 11 Jun 2002 11:10
Date: Tue, 11 Jun 2002 11:10
89 lines
4259 bytes
4259 bytes
Christof Laeremans <christof_laeremans@hotmail.com> wrote:
> Code
> ---------
> Stack::Stack(Stack &st)
> {
> _start = NULL;
> Element* temp = st._start;
> While(temp)
> {
> Element*e = new Element(temp -> getData());
> e -> setNext(_start);
> _start = e;
> temp = temp -> getNext();
> }
> }
> De vraag is nu, bestaat er geen "eenvoudigere" manier om een copy
> constructor te implementeren voor een LIFO lijst.
> Maar er is me nog iets opgevallen bij deze copy constructor ... Ik denk dat
> het er ene is voor een FIFO lijst (of vergis ik me) want als ik een kopie
> maak van het object dat de lijst bevat bv. A B C D dan komt er D C B A ....
Je laat de code voor Element::getNext() niet zien, maar als ze doet
wat de naam suggereert wordt de lijst intern inderdaad omgedraaid.
En dus is de code zowel fout voor een FIFO lijst als voor een LIFO
lijst. Want wat je der ook insteekt, het komt er omgekeerd weer
uit.
Tenslotte is er nog iets 'fout'. Een 'echte' copy constructor neemt
als parameter een const reference en geen reference. Maar laten we
dat even terzijde.
Dat gezegd zijnde kunnen we eens gaan denken over 'eenvoudigere' code.
In de hoop dat die eenvoud ook zal inhouden dat het juist zal zijn.
Hier is wat ik zou doen (buiten de STL gebruiken, natuurlijk, maar
ik veronderstel dat je docent je op pointers wil trainen)
Stack::Stack(Stack& st)
: _start(0)
{
if (st._start)
_start = st._start->copy();
}
Dat kan alvast niet fout zijn, maar nu hebben we het probleem wel
verschoven naar een 'copy' functie in Element. Maakt dat de zaak
eenvoudiger? Hoe zouden we die copy schrijven? (Ik veronderstel
even dat _next de variable is die naar het volgende element wijst)
Element* Element::copy()
{
Element* r = new Element(getData());
if (_next)
r->_next = _next->copy();
return r;
}
Waarom is deze oplossing nu eenvoudiger? We hebben onze 'moeilijke'
taak in twee eenvoudige opgesplitst. Zijnde : copieer het eerste
element van een gelinkte lijst en copieer de rest van een
gelinkte lijst. En aangezien het tweede deel van het probleem
eigenlijk ons oorspronkelijke probleem is, gebruiken we heel
natuurlijk recursie.
Een echt lastige docent zou nog als bijvraag kunnen opmerken.
Ja maar : als dit een general purpose stack class is, dan kunnen
die wel eens heel veel elementen bevatten. Wordt dat in de praktijk
dan geen probleem met betreffende stack overflow door het teveel
aanroepen van recursieve functies. Dan zou ik antwoorden.
Dit is een duidelijk geval van 'tail recursion'. De optimalisaties
daarvoor zijn goed gekend en dus in bijna alle moderne compilers
voorzien. En in het geval dat je daar niet op wil/kan rekenen,
is het triviaal om zelf de tail recursion optimisatie uit te
voeren.
(Maar een lastige docent moet ook bereid zijn om zelf op lastige
vragen te antwoorden, zoals waarom hij in dit geval het object
Element dat de data draagt 'vervuilt' met puur infrastructurele
zaken zoals de pointer van de gelinkte lijst. Het gevolg is dat
'Element' enkel in data structuren kan gebruikt worden die volgens
dat principe werken... Beter was om de logical van Stack volledig
binnen 'Stack' te houden en niet deels naar Element te exporteren.)
cu bart
--
http://www.irule.be/bvh/
Technical Details
Message-ID:
<fql4ea.b0c.ln@ns1.irule.be>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-05!supernews.com!feed.textport.net!diablo.netcom.net.uk!netcom.net.uk!newsfeed.icl.net!colt.net!newspeer.clara.net!news.clara.net!skynet.be!skynet.be!louie!not-for-mailReferences:
<B92ACD30.664E%christof_laeremans@hotmail.com>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit
X-Google-Thread: fcea4,d9871be4e7eaae5e
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2002-06-11 04:12:39 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-05!supernews.com!feed.textport.net!diablo.netcom.net.uk!netcom.net.uk!newsfeed.icl.net!colt.net!newspeer.clara.net!news.clara.net!skynet.be!skynet.be!louie!not-for-mail
Sender: - <bvh@ns1.irule.be>
From: Bart.Vanhauwaert@nowhere.be
Subject: Re: [C++]: copy constructor en LIFO lijst
Newsgroups: be.comp.programming
References: <B92ACD30.664E%christof_laeremans@hotmail.com>
User-Agent: tin/1.4.4-20000803 ("Vet for the Insane") (UNIX) (Linux/2.2.17-21mdksecure (i686))
Date: Tue, 11 Jun 2002 13:10:07 +0200
Message-ID: <fql4ea.b0c.ln@ns1.irule.be>
Lines: 89
NNTP-Posting-Host: 194.78.202.248
X-Trace: 1023793940 reader1.news.skynet.be 6965 194.78.202.248
X-Complaints-To: abuse@skynet.be