2013-04-24 25 views
10

Tôi có cấu trúc "MachineState" và tôi đã tạo danh sách loại "MachineState *". Khi tôi cố gắng lặp qua danh sách tôi tiếp tục nhận "Biểu thức phải có kiểu con trỏ đến lớp

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

Tôi đang sử dụng Microsoft Visual Studio 10. Tôi googled lỗi và tất cả tôi có thể tìm hiểu là" The -> điều hành phải trả lại một lớp, struct , hoặc công đoàn, hoặc một tham chiếu đến một. "

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; 

}; 

tôi tuyên bố danh sách như

std::list<MachineState*> zombs; 

đây là nơi tôi cố gắng lặp qua danh sách của tôi và tôi vẫn gặp lỗi, trên" it-> point1 "nói rằng t biểu thức của anh ta phải có một con trỏ tới kiểu lớp.

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

Nếu bất cứ ai có thể giải thích cho tôi là những gì wron

Trả lời

19

it là một iterator để một con trỏ đến một MachineState.

Bạn cần phải bỏ qua con trỏ vòng lặp con trỏ.

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

Edit:

dereferencing nghĩa nhận được điều mà nó đề cập đến.

Dereferencing được thực hiện với toán tử * hoặc ->.

Nếu it là một MachineState, bạn có thể sử dụng it.point1

Nếu it là một con trỏ đến một MachineState, bạn có thể sử dụng it->point1 hay (*it).point1

Nếu it là một iterator đến một MachineState, bạn cũng có thể sử dụng it->point1 hoặc (*it).point1

Kể từ it là một iterator để một con trỏ đến một MachineState, bạn phải sử dụng (*it)->point1 hoặc (**it).point1

+0

Đó là câu trả lời đúng. Tôi xin lỗi, tôi là người mới bắt đầu trong C++. bạn sẽ cho tôi biết ý của bạn là gì bởi dereferencing? Cảm ơn bạn rất nhiều vì câu trả lời –

+0

@JohnKemp Xem chỉnh sửa của tôi. –

+1

Cảm ơn @DrewDormann. Bây giờ tôi hiểu rồi –