【问题标题】:Expression must have pointer-to-class-type表达式必须具有指向类类型的指针
【发布时间】:2013-04-24 04:07:59
【问题描述】:

我有一个结构“MachineState”,并创建了一个“MachineState*”类型的列表。当我尝试遍历列表时,我不断得到“

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

我使用的是 Microsoft Visual Studio 10。我用谷歌搜索了这个错误,我只能找到“-> 运算符必须返回一个类、结构或联合,或对一个的引用。”

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

如果有人能解释我怎么了

【问题讨论】:

    标签: c++ list pointers struct iterator


    【解决方案1】:

    it 是一个迭代器,指向一个指针,指向一个MachineState

    您需要取消引用迭代器然后指针。

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

    编辑:

    解除引用意味着得到它所引用的东西

    使用*-&gt; 运算符完成取消引用。

    如果itMachineState,您可以使用it.point1

    如果it 是指向MachineState指针,您可以使用it-&gt;point1(*it).point1

    如果itMachineState迭代器,您也可以使用it-&gt;point1(*it).point1

    由于it指向MachineState 的指针的迭代器,因此您必须使用(*it)-&gt;point1(**it).point1

    【讨论】:

    • 这是正确的答案。对不起,我是 C++ 的初学者。你能告诉我取消引用是什么意思吗?非常感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多