0

私は、絶えず動いているオブジェクトを保持することになっている 2D 配列を持っています。

class ZombieLand : public Singleton<ZombieLand>
{
   DECLARE_SINGLETON(ZombieLand);
public:
    MachineState world [19][19];
    MachineState getWorld()
    {
       std::cout<<"World";
       return world[19][19];
    }
    void setWorld(MachineState & state)
    {
    world [state.x][state.y] = state;

    }
}

特定の場所が Null かどうかを確認しようとしましたが、「NULL」という単語は機能せず、0 も機能しません

switch (state.m_Facing)
{
 case (MachineState::UP):
    if(ZombieLand::get().world[state.x][state.y-1] != NULL )
    {
       state.m_occupied = true;
       break;
    }

私の質問は、ワールド配列の場所が既にオブジェクトを保持しているかどうかを確認するにはどうすればよいですか? 前もって感謝します。

私の MachineState クラス

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;
  bool m_occupied;
  int x;
  int y;
  Point point1;
  Point point2;
  Point point3;

  int GetActionsPerTurn() const throw() { return m_ActionsPerTurn; }
  int GetMaxMemory() const throw() {return m_MaxMemory; }
  bool GetInfect() const throw() { return m_InfectOnAttack; }
  void setPoint(Point p1, Point p2, Point p3)
  {
    point1=p1;
    point2=p2;
    point3=p3;
 }

};

4

1 に答える 1

2

ここに行くには 2 つの方法があります。

最初: のコンストラクターでMachineState、そのフィールドにあるものを決定する変数を設定し、それを伝える関数を追加する必要があります。その戻り値が「0」の場合、フィールドが空であることがわかります。

2 番目: ポインターの 2 次元配列を宣言します。

MachineState *world[19][19];
memset(world, 0, sizeof(world));

この小さなコードは、すべてのポインターを 0 (NULL) に設定します。これを確認できます。もちろん、この 2 次元配列に手動でオブジェクトを割り当てる必要があります。

少しプラスとして、あなたのgetWorld()関数はかなりバグがあるように見えます。

代わりにこの関数を使用することを検討してください:

MachineState *getField(MachineState state) {
    return world[state.x][state.y];
}

または、もちろん次を使用できます。

MachineState *getField(int X, int Y) {
    return world[X][Y];
}

後者の関数は、次のように呼び出すことができます。

MachineState *Field = ZombieLand::getField(state.x, state.y - 1);
if(Field != NULL) state.m_occupied = true;

もちろん、境界チェックを追加する必要がありますが、それはこの回答の範囲を超えています。

于 2013-04-24T19:08:21.487 に答える