2014-01-11 5 views
1

저는 대학 프로젝트 용 로봇 시뮬레이터를 설계하고 있습니다. 충돌 감지에 큰 문제가 있습니다.부울 값이있는 이상한 동작

#ifndef robot_h 
#define robot_h 

#include <vector> 

enum direction 
{ 
    UP,DOWN,LEFT,RIGHT 
}; 

enum motor 
{ 
    STOP,SLOW,FAST 
}; 

class robot 
{ 
public: 
    robot(); 

    char bot; // The bot onscreen 
    int getX(); // The X position of robot 
    int getY(); // The Y position of robot 

    int dir; // The direction the robot is going 

    bool touchSensor; // Boolean value if collision 
    int lightSensor; // light sensor between 10-100 
    int motorA; // Motor A between 0, 1 and 2 
    int motorB; // Motor A between 0, 1 and 2 
    void detection(int x, int y); 

    void getReturnObject(); 
    bool returnObjectDash; 
    bool returnObjectLine; 

    void move(); // Moving the robot 
    void draw(); // Drawing the robot on screen 
    void update(); // Updating the robot position 

private: 
    int positionX; // Starting X value 
    int positionY; // Starting Y value 
}; 

#endif 

는 기본적으로, 두 개의 부울 값을 사용하고 있습니다 : returnObjectDash;returnObjectLine 여기 내 robot.h 헤더 파일입니다. 내 matrix.cpp 파일에이 코드를 가지고 :

내 robot.cpp 내부
void matrix::detection(int x, int y) 
{ 
    if(vector2D[x][y]=='-') 
    { 
     returnObjectDash=true; 
     system("pause"); 
    } 
    else 
    { 
     returnObjectDash=false; 
    } 
    if(vector2D[x][y]=='|') 
    { 
     returnObjectLine=true; 
    } 
    else 
    { 
     returnObjectLine=false; 
    } 
} 

내가 콘솔에 두 개의 부울 값을 가져온 다음 출력이 코드를 가지고 :

void robot::getReturnObject() 
{ 
    if(returnObjectDash==true) 
    { 
     std::cout<<"Dash\n"; 
     //dir=DOWN; 
    } 
    if(returnObjectLine==true) 
    { 
     std::cout<<"Line\n"; 
     //dir=DOWN; 
    } 
} 

이 내입니다 main.cpp

int main() 
{ 
    robot r; 

    while(true) 
    { 
     matrix m; 
     m.robotPosition(r.getX(), r.getY()); 
     m.update(); // vector2D init and draw 
     m.detection(m.getX(), m.getY()); 
     r.update(); 
     Sleep(250); 
    } 
} 

matrix.cpp 기본 생성자의 두 부울 변수의 기본값을 false로 설정하고 있습니다. 일시 정지 버튼을 누르고 디버그 할 때 두 가지 다른 결과를 얻는 것 같습니다. 내 행렬에 대해서는 false를 반환하지만, 내 로봇은 사실을 반환하지만 내 프로그램은 두 개의 다른 변수를 만드는 것과 같습니다. 누군가가이 이상한 행동에 대해 밝힐 수 있다면 알려주세요. 매트릭스 클래스, 그러나, void matrix::detection(int x, int y)에서 판단 나는 당신이 감지라는 존재의 방법을 가지고 있다고 가정하고 같은 필드 returnObjectLinereturnObjectDash를 선언 한 것을 당신은 당신에게 코드를 제공하지 않은 당신에게

+0

"기본값은 true입니다."- 아니요, 기본값은 정의되지 않습니다. – addaon

+0

로봇에서 returnObject * 변수를 설정하는 코드는 어디에 있습니까? 매트릭스 코드는 어디에 있습니까? 결과가 일치 할 것으로 예상하는 호출 코드는 무엇입니까? – addaon

+0

오, 미안 해요, 제 질문을 업데이트 할게요. –

답변

1

두 가지 값이 있으므로 프로그램이 두 개의 다른 값을 만듭니다. matrix 클래스에는 분명히 자체 부울 변수 matrix::returnObjectDash이 있고 로봇 클래스에는 자체 변수 robot::returnObjectDash이 있습니다. 한 클래스의 한 인스턴스에서 변수를 설정해도 다른 클래스 (또는 다른 인스턴스)의 변수에는 영향을주지 않습니다.

+0

좋아요, 그래서 그 논리에 대해 생각해 보겠습니다. main.cpp에 returnObject를 설정해야합니다. 둘 다 거기에 액세스 할 수 있습니까? –

+0

둘 다 액세스 할 수있는 단일 변수를 사용할 수 있습니다 (예). 이를 달성하기 위해 기술 수준에서 로봇 인스턴스와 행렬 인스턴스에 동일한 변수에 대한 포인터 또는 참조를 전달합니다. 나는 그것이 좋은 계획인지를 알기위한 디자인에 대한 충분한 그림을 가지고 있지 않습니다. – NicholasM

+0

실제로 포인터를 만든 다음 그것을 참조하는 것에 대해 생각하고있었습니다.이 아이디어를 가져 주셔서 감사합니다. 고맙습니다. –

1

감사드립니다.

두 가지 버전의 변수가 있다고 가정하면 정확합니다. 그 중 하나는 매트릭스 객체 안에 있고 다른 하나는 로봇 객체 안에 있습니다.

뿐만 아니라 둘 이상의 행렬/로봇 객체를 가질 수 있습니다 (대개!). 각각의 변수에는 해당 변수의 별도 사본이 있으며, 변수 중 하나를 변경해도 다른 변수에는 영향을주지 않습니다.

+0

아, 그렇습니다. 업데이트에 대한 원래 질문을 참조하십시오. –