Я разрабатываю симулятор робота для университетского проекта, и я столкнулся с большой проблемой для обнаружения столкновений. Вот мой заголовочный файл robot.h:
#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
, У меня есть этот код в моем файле matrix.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;
}
}
Внутри моего robot.cpp у меня есть этот код, который получает два логических значения и выводит их на консоль:
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, хотя для моего робота это возвращает true, как будто моя программа создает две разные переменные. Если кто-то может пролить свет на это странное поведение, то, пожалуйста, расскажите! Спасибо
Ваша программа делает два разных значения, потому что это имеет два разных значения. matrix
класс, по-видимому, имеет свою собственную логическую переменную, matrix::returnObjectDash
и класс робота имеет свою собственную переменную, robot::returnObjectDash
, Установка переменной в одном экземпляре одного класса не влияет на переменные в любых других классах (или любых других экземплярах).
Вы не предоставили код для своего матричного класса, однако, исходя из void matrix::detection(int x, int y)
Я предполагаю, что у вас есть метод, называемый обнаружением, и что вы объявили те же поля returnObjectLine
а также returnObjectDash
,
Вы правы, предполагая, что существует две версии этих переменных: одна из этих версий находится внутри вашего объекта матрицы, а другая — внутри вашего объекта робота.
Мало того, вы можете (и обычно делаете!) Иметь более одного объекта матрицы / робота. Каждая из них будет иметь свою собственную копию этих переменных, и изменение одной из них не повлияет на другие.