2013-04-24 3 views
0

저는 계속 움직이는 객체를 보관해야하는 2D 치수 배열을 가지고 있습니다.2D 배열의 객체가 Null인지 확인합니다.

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; 

    } 
} 

내 질문은 0

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

가 어떻게이 있는지 확인할 수 있습니다 나는 특정 위치에 Null이 있는지 확인하려고하지만, "NULL"단어가 작동하지 않으며, 수행 내 세계 배열의 위치가 이미 객체를 보유하고 있습니까? 미리 감사드립니다.

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

};

+0

어떻게'MachineState'가 정의 되었습니까? 'MachineState' 유형의 객체에 대해'포인터 '의 2 차원 배열을 만드는 것을 고려 했습니까? –

+0

FYI 싱글 톤이 좋지 않습니다. 매크로가 좋지 않습니다. – David

+0

@Dave 감사합니다. 방금 책을 읽었습니다. 전역 변수를 선언하는 것보다 더 낫다고 말하면서 구현해 보겠습니다. –

답변

2

여기에는 두 가지 방법이 있습니다.

첫 번째 : 생성자가 MachineState 인 경우 변수를 설정해야합니다.이 변수는 해당 필드의 내용을 결정하고이를 알려주는 함수를 추가합니다. 반환 값이 '0'이면 필드가 비어 있음을 알 수 있습니다.

두 번째 : 포인터의 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; 

경계 검사를 추가해야하지만이 답변의 범위를 벗어납니다.

+0

안녕하세요 @ 리프크닉 이터 늄. 귀하의 도움에 감사드립니다. 두 번째는 당신이 그것을 볼 필요가있을 경우에 대비해 내 컴퓨터 클래스를 추가했습니다 ... 그러나 당신의 설명이 트릭을하는 것처럼 보입니다. –

관련 문제