Toon posts:

[c++] Ruzie met stl list

Pagina: 1
Acties:

Verwijderd

Topicstarter
De volgende code :
code:
1
2
3
4
5
6
7
8
9
10
11
typedef list<ITask*> CTaskList;


CTaskList::const_iterator Iter = m_TaskList.begin();
  while(Iter != m_TaskList.end()) {
    const ITask* pTask = Iter;
    // of 
    const ITask* pTask = &(*Iter);
    pTask->GoGetIt();
    ++Iter;
  }

m_TaskList is een stl lijst van het type CTaskList. Ivm met readablility wil ik niet Iter gebruiken maar een duidelijke pointer, hier dus pTask. De compiler klaagt over de toekenning van Iter aan pTask. Bij maps werkt dit zonder problemen. Waarschijnlijk snap ik de foutmelding niet ( STL melding van 10 regels ).

Wat doe ik fout...

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Je post de melding niet.

Professionele website nodig?


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Iter wijst naar het eerste element in de list, een ITask *, jij wilt dus iets wat wijst naar een ITask * toekennen aan iets dat wijst naar een ITask.

Volgens mij moet het zijn:
C++:
1
ITask const * pTask = *Iter;


Maar zonder foutmelding weet ik dat ook niet zeker natuurlijk.

edit:
Stijlvraagje: Waarom gebruik je geen for() loop? Dan hou je de scope van je iterator ook binnen je loop.

[ Voor 19% gewijzigd door _Squatt_ op 25-06-2003 01:03 ]

"He took a duck in the face at two hundred and fifty knots."


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Verwijderd schreef op 25 June 2003 @ 00:25:
De volgende code :
code:
1
2
3
4
5
6
7
8
9
10
11
typedef list<ITask*> CTaskList;


CTaskList::const_iterator Iter = m_TaskList.begin();
  while(Iter != m_TaskList.end()) {
    const ITask* pTask = Iter;
    // of 
    const ITask* pTask = &(*Iter);
    pTask->GoGetIt();
    ++Iter;
  }

m_TaskList is een stl lijst van het type CTaskList. Ivm met readablility wil ik niet Iter gebruiken maar een duidelijke pointer, hier dus pTask. De compiler klaagt over de toekenning van Iter aan pTask. Bij maps werkt dit zonder problemen. Waarschijnlijk snap ik de foutmelding niet ( STL melding van 10 regels ).

Wat doe ik fout...
Dingen willen. ;)

Die pointer voegt niets toe, en zet daarom de volgende lezer op het verkeerde been. Als je al een naam wil geven aan dat object, gebruik dan een reference: de pointer wordt nooit 0, en de waarde verandert ook niet gedurende z'n levensduur.

De eerste regel is simpelweg fout. Met map zal het ook nooit gewerkt hebben. De tweede regel zou wel moeten werken voor list (niet voor map, want die heeft pair<key,value> iterators )

Ik zou de code met een std::for_each en std::mem_fun schrijven.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
De compiler error :

code:
1
2
3
4
5
d:\code\test.cpp(18): error C2440: 'initializing' : cannot convert from 'std::list<_Ty>::const_iterator' to 'const ITask *'
        with
        [
            _Ty=ITask *
        ]


! Dit is de error van de code in het bericht waarmee ik het topic gestart ben !

[ Voor 24% gewijzigd door Verwijderd op 25-06-2003 01:22 ]


Verwijderd

Topicstarter
MSalters schreef op 25 June 2003 @ 01:02:
[...]

Dingen willen. ;)

Die pointer voegt niets toe, en zet daarom de volgende lezer op het verkeerde been. Als je al een naam wil geven aan dat object, gebruik dan een reference: de pointer wordt nooit 0, en de waarde verandert ook niet gedurende z'n levensduur.

De eerste regel is simpelweg fout. Met map zal het ook nooit gewerkt hebben. De tweede regel zou wel moeten werken voor list (niet voor map, want die heeft pair<key,value> iterators )

Ik zou de code met een std::for_each en std::mem_fun schrijven.
ik wil heel graag de discussie voeren wat beter is voor de readability, maar Iter gebruiken is helemaal wazig zeker als je meerder iterators moet gebruiken.
De "extra" pointer zal door de compiler wel weg "geoptimized" worden, leesbaarheid is de kreet ! Ik ga eerst je ander tips bekijken.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

dat is wel zo, maar het is nog maar de vraag of

C++:
1
2
3
4
5
6
while(Iter != m_TaskList.end())
{
    const ITask* pTask = Iter;
    pTask->GoGetIt();
    ++Iter;
}


leesbaarder is dan bijvoorbeeld

C++:
1
2
for (; Iter != m_TaskList.end(); ++Iter)
    (*Iter)->GoGetIt ();

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Verwijderd schreef op 25 June 2003 @ 01:20:
[...]
ik wil heel graag de discussie voeren wat beter is voor de readability, maar Iter gebruiken is helemaal wazig zeker als je meerder iterators moet gebruiken.
De "extra" pointer zal door de compiler wel weg "geoptimized" worden, leesbaarheid is de kreet ! Ik ga eerst je ander tips bekijken.
Nee, pIter voor een pointer is duidelijk :+

Als ik een variabele een simpele naam geef is dat om dat de scope simpel is. Een 10-regelige for-loop mag best een loop-index i hebben.
Wat betreft de pointer, die meestal kan niet weggeoptimaliseerd worden. De compiler kan vrijwel nooit alle subtiele manieren ontdekken waardoor Iter en pIter kunnen veranderen, dus aannemen dat ze gelijk blijven is dan niet mogelijk. Alleen in de simpele situaties kan de compiler dat, maar juist in die gevallen is de winst van de extra pointer nihil.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1