2013-04-24 7 views
10

Mam struct "MachineState" i utworzyłem listę typu "MachineState *". Kiedy próbuję wykonać iterację listy ciśgle „Wyrażenie musi mieć wskaźnik do klasy typu

error C2839: invalid return type 'MachineState **' for overloaded 'operator -> 

Używam Microsoft Visual Studio 10. google błąd i wszystko mogę dowiedzieć się był” -> operator musi wrócić do klasy, struct lub związek lub odniesienie do jednego. „

Struct MachineState 
{ 

    template <typename MachineTraits> 
    friend class Machine; 

    enum Facing { UP, RIGHT, DOWN, LEFT}; 
    MachineState() 
    : m_ProgramCounter(1) 
    , m_ActionsTaken(0) 
    , m_Facing(UP) 
    , m_Test(false) 
    , m_Memory(nullptr) 
    ,x(0) 
    ,y(0) 
    ,point1(25, 10) 
    ,point2(10, 40) 
    ,point3(40, 40) 

    { } 


    int m_ProgramCounter; 
    int m_ActionsTaken; 

    Facing m_Facing; 
    bool m_Test; 
    int x; 
    int y; 
    Point point1; 
    Point point2; 
    Point point3; 

}; 

Oświadczam listę jako

std::list<MachineState*> zombs; 

Oto gdzie staram się iterację mojej liście i ciśgle błąd, na” it-> point1 "mówiąc, że t wyrażenie musi mieć wskaźnik do typu klasy.

for(std::list<MachineState*>::iterator it = zombs.begin(); it != zombs.end(); it++) 
    { 
     Point points[3] = {it->point1, it->point2, it->point3}; 
     Point* pPoints = points; 
     SolidBrush brush(Color(255, 255, 0, 0)); 
     m_GraphicsImage.FillPolygon(&brush, pPoints,3); 
    } 

Jeśli ktoś może mi wyjaśnić co wron

Odpowiedz

19

it jest iterator do wskaźnik do MachineState.

Musisz usunąć wskaźnik iteratora i ze wskaźnika.

Point points[3] = {(*it)->point1, (*it)->point2, (*it)->point3}; 

Edit:

dereferencing oznacza coraz rzeczą, która to odnosząc się do.

Dereferencję przeprowadza się za pomocą operatora * lub ->.

Jeśli it były MachineState, można użyć it.point1

Jeśli it były wskaźnik do MachineState, można użyć it->point1 lub (*it).point1

Jeśli it były iterator do MachineState, można również użyć it->point1 lub (*it).point1

Od it jest iterator do wskaźnika do MachineState, należy użyć (*it)->point1 lub (**it).point1

+0

To poprawną odpowiedź. Przykro mi, jestem początkującym w języku C++. czy powiedziałbyś mi, co masz na myśli przez dereferencję? Dziękuję bardzo za odpowiedź –

+0

@JohnKemp Zobacz moją edycję. –

+1

Dzięki @DrewDormann. Teraz rozumiem –