Подтвердить что ты не робот

Выражение должно иметь тип указателя на класс

У меня есть структура "MachineState", и я создал список типов "MachineState *". Когда я пытаюсь выполнить итерацию по списку, я продолжаю получать "

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

Я использую Microsoft Visual Studio 10. Я googled ошибка, и все, что я мог узнать, это "Оператор → должен возвращать класс, структуру или объединение или ссылку на один".

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;

};

Объявляю список как

 std::list<MachineState*> zombs;

Вот где я пытаюсь выполнить итерацию через свой список, и я продолжаю получать ошибку, на "it- > point1", говоря, что выражение должно иметь указатель на тип класса.

    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);
     }

Если кто-нибудь может объяснить мне, что wron

4b9b3361

Ответ 1

it является итератором для указателя на MachineState.

Вам нужно разыменовать итератор и указатель.

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

Edit:

Выделение означает получение того, на что оно ссылается.

Выделение происходит с помощью оператора * или ->.

Если it были MachineState, вы могли бы использовать it.point1

Если it был указателем на MachineState, вы могли бы использовать it->point1 или (*it).point1

Если it был итератором до MachineState, вы также можете использовать it->point1 или (*it).point1

Так как it является итератором с указателем на MachineState, вы должны использовать (*it)->point1 или (**it).point1