我有两个班,Car和Person。汽车作为其成员之一的人,驾驶员的实例。我想移动一辆车,同时跟踪它的位置,并将驾驶员移到车内并获得它的位置。然而,虽然这可以从类内部工作(我已经打印出计算出的值),但当我尝试从main访问数据时,那里什么都没有。即数组位置[]最终为空。我想知道我设置类的方式是否有问题 - 这可能是对象范围的问题吗?
我尝试过简化代码,以便我只提供必要的内容。希望涵盖您需要查看的所有内容。构造函数Car()用非零值填充驱动程序的偏移数组。
class Car{
public:
Container(float=0,float=0,float=0);
~Container();
void move(float);
void getPosition(float[]);
void getDriverPosition(float[]);
private:
float position[3];
Person driver;
float heading;
float velocity;
};
class Person{
public:
Person(float=0,float=0,float=0);
~Person();
void setOffset(float=0,float=0,float=0);
void setPosition(float=0,float=0,float=0);
void getOffset(float[]);
void getPosition(float[]);
private:
float position[3];
float offset[3];
};
部分功能:
void Car::move(float time){
float distance = velocity*time;
location[0] += distance*cos(PI/2 - heading);
location[1] += distance*sin(PI/2 - heading);
float driverLocation [3];
float offset[3];
driver.getOffset(offset);
for (int i = 0; i < 3; i++){
driverLocation[i] = offset[i] + location[i];
}
driver.setPosition(driverLocation[0],driverLocation[1],driverLocation[2]);
}
void Car::getDriverPosition(float p[]){
driver.getPosition(p);
}
void Person::getPosition(float p[]){
for (int i = 0; i < 3; i++){
p[i] = position[i];
}
}
void Person::getOffset(float o[]){
for (int i = 0; i < 3; i++){
o[i] = offset[i];
}
}
在Main:
Car * car = new Car();
car->move();
float p[3];
car->getDriverPosition(p);
当我在move()函数中打印driverLocation []时,我有实际的非零值。当我在main中打印p []时,我得到的只是零。
新发现的问题:通过一些调试,我发现每次调用move()都会调用Person类的析构函数,从而删除所有数据。任何人都知道如何发生这种情况?我不会在任何地方调用析构函数,如何防止它发生。
答案 0 :(得分:0)
你从未将driverLocation数组传递给person
- 怎么知道它被移动了? (即您需要在driver->setPosition(driverLocation)
)
move
答案 1 :(得分:0)
在您展示的代码中,您似乎永远不会设置person.position
在move中设置一个名为driverLocation的局部变量。
答案 2 :(得分:0)
上面代码的问题是
行driver->getOffset(offset);
私有成员驱动程序不是指针类型。
将其更改为:driver.getOffset(offset)
另一种解决方案是这样的:
// header
class Car
{
private:
Person* driver;
public:
Car();
~Car();
}
// source
Car::Car()
{
driver = new Person();
}
Car::~Car()
{
delete driver;
}
答案 3 :(得分:0)
所以我认为我明白了。我认为问题在于我是通过值将对象传递给move()函数。我切换到将它作为指向对象的指针传递,并且它有效!