2010-05-03 20 views
0

我有兩個類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]; 
    } 
} 

在主:

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

當我打印driverLocation []移動()函數中,我有實際非零值。當我在main中打印p []時,我得到的都是零。

新發現的問題:通過一些調試,我發現每次調用move()都會調用Person類的析構函數,從而刪除所有數據。任何人都有關於如何發生這種情況的想法?我不會在任何地方調用析構函數,我如何防止它發生。

回答

0

所以我認爲我想通了。我認爲問題在於我將值通過值傳遞給move()函數。我轉而將它作爲指向該對象的指針傳遞,並且它工作正常!

0

您從未將driverLocation數組傳遞到person - 它應該如何知道它已移動? (即你需要調用driver->setPosition(driverLocation)move

+0

謝謝。我更新了這個問題,因爲新的信息改變了可能的錯誤。 – Hypatia 2010-05-04 07:31:21

0
代碼

告訴你,你似乎從來沒有設置person.position

設置在招叫driverLocation一個局部變量。

+0

是的,謝謝。看起來我沒有把我的代碼留在這裏,但是我在代碼中有這樣的代碼,但仍然無法工作。我改變了我的問題,因爲我已經縮小了真正的問題。 – Hypatia 2010-05-04 07:20:47

+0

我們必須相信你driver.setposition是做正確的事 - 因爲玉唐展示它 – pm100 2010-05-05 23:49:41

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; 
} 
+0

謝謝。你是對的。我想我只是把它抄襲而已。仍然不能解決每次調用move()後析構函數都會被調用的問題。 – Hypatia 2010-05-04 15:21:05