从外部类访问时,类中的数据更改未显示

时间:2010-05-03 22:08:21

标签: c++ arrays class-design destructor

我有两个班,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类的析构函数,从而删除所有数据。任何人都知道如何发生这种情况?我不会在任何地方调用析构函数,如何防止它发生。

4 个答案:

答案 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()函数。我切换到将它作为指向对象的指针传递,并且它有效!