1. ホーム
  2. c++

[解決済み] 式はポインタからクラスへの型を持っていなければならない

2022-02-07 01:02:59

質問

私は構造体 "MachineState"を持っていて、型 "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);
     }

何が問題なのか説明できる人がいたら教えてください。

解決方法は?

it へのイテレータです。 ポインタ から MachineState .

イテレータをデリファレンスする必要があります。 そして ポインタを指定します。

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

編集する

デリフェレンシング とは 参照しているものを取得する .

デリファレンスは * または -> 演算子を使用します。

もし itMachineState を使用することができます。 it.point1

もし it ポインタ から MachineState を使用することができます。 it->point1 または (*it).point1

もし it イテレータ から MachineState を使用することもできます。 it->point1 または (*it).point1

以来 it イテレータからポインタ に対して MachineState を使用する必要があります。 (*it)->point1 または (**it).point1