Изменения в данных внутри класса не отображаются при доступе извне класса - PullRequest
0 голосов
/ 04 мая 2010

У меня есть два класса, Автомобиль и Человек. Автомобиль имеет в качестве одного из своих членов экземпляр лица, водителя. Я хочу переместить автомобиль, следя за его местоположением, а также переместить водителя в машину и узнать его местоположение. Однако, хотя это работает изнутри класса (я распечатал значения по мере их вычисления), когда я пытаюсь получить доступ к данным из 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];
    }
}

В основном:

Car * car = new Car();
car->move();
float p[3];
car->getDriverPosition(p);

Когда я печатаю driverLocation [] внутри функции move (), я получаю реальные ненулевые значения. Когда я печатаю p [] внутри main, я получаю только нули.

Недавно обнаруженная проблема: с помощью некоторой отладки я обнаружил, что каждый раз, когда я вызываю move (), вызывается деструктор для класса Person, и, таким образом, удаляются все данные. У кого-нибудь есть идеи о том, как это могло произойти? Я нигде не вызываю деструктора, как я могу предотвратить это.

Ответы [ 4 ]

0 голосов
/ 06 мая 2010

Так что я думаю, что понял это. Я думаю, проблема заключалась в том, что я передавал объект по значению в функцию move (). Я переключился на передачу его в качестве указателя на объект, и это сработало!

0 голосов
/ 04 мая 2010

в коде, который вы показываете, вы, кажется, никогда не устанавливаете person.position

Вы устанавливаете локальную переменную в движении, называемую driverLocation.

0 голосов
/ 04 мая 2010

Проблема с кодом выше - строка

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;
}
0 голосов
/ 04 мая 2010

Вы никогда не передавали массив driverLocation в person - как он должен знать, что он перемещен? (т.е. вам нужно позвонить driver->setPosition(driverLocation) внутри move)

...