2010-05-03 5 views
0

두 클래스 인 Car 및 Person이 있습니다. Car에는 멤버 중 하나 인 Person이라는 인스턴스가 있습니다. 나는 그 위치를 추적하면서 차를 움직이고 차 안에서 운전자를 움직여 그 위치를 얻고 싶다. 그러나 이것이 클래스 내부에서 작동하는 동안 (계산 된대로 값을 출력했습니다), 메인에서 데이터에 액세스하려고하면 아무 것도 없습니다. 나는. 배열 위치 []가 비어있게됩니다. 클래스를 설정하는 방식에 문제가 있는지 궁금합니다. 오브젝트의 범위 문제 일 수 있습니까?클래스 외부에서 액세스 할 때 클래스 내부의 데이터 변경 내용이 표시되지 않습니다.

필자는 코드를 단순화하여 필요한 것만 제공하려고 노력했습니다. 다행히도 당신이보아야 할 모든 것을 다 포함하고 있기를 바랍니다. 생성자 Car()는 드라이버의 오프셋 배열을 0이 아닌 값으로 채 웁니다.

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]; 
    } 
} 

메인 이어 : I 인쇄 할 때

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

driverLocation [] 이동() 함수 내부 I 실제 제로가 아닌 값을 갖는다. 메인에서 p []를 프린트 할 때, 나는 모두 0입니다.

새로 발견 된 문제 : 일부 디버깅을 통해 move()를 호출 할 때마다 Person 클래스의 소멸자가 호출되고 모든 데이터가 삭제된다는 것을 발견했습니다. 이것이 일어날 수있는 방법에 대해 누구나 알고 있습니까? 나는 어디에서나 소멸자를 부르지 않는다. 나는 그것을 어떻게 막을 수 있을까?

답변

0

그래서 내가 그것을 알아 냈다고 생각 : driver.getOffset(offset)

또 다른 해결책은 다음과 같이 될 것이다. 문제는 move() 함수에 객체를 값으로 전달한다는 것입니다. 나는 그것을 객체에 대한 포인터로 넘겨 주었다.

0

person에 driverLocation 배열을 전달하지 않았습니까? 이동 한 것을 어떻게 알 수 있습니까? 당신은 당신이

person.position 당신이 driverLocation라는 이동의 지역 변수를 설정 설정하는 것 결코 보여 코드에서

+0

감사합니다. 나는 새로운 정보가 무엇이 잘못 될 수 있었는지로 질문을 업데이트했다. – Hypatia

0

(즉, 당신은 move 내부 driver->setPosition(driverLocation)를 호출해야합니다).

+0

예, 감사합니다. 여기에 작성된 코드에서 벗어난 것으로 보이지만 코드에서 그 라인을 사용했지만 여전히 작동하지 않습니다. 나는 진짜 문제가 무엇인지를 좁히기 때문에 내 질문을 변경했다. – Hypatia

+0

우리는 그 운전자를 믿어 줘야합니다. 설정은 옳은 일을하고 있습니다 - 유 덕분에 보여주세요. – pm100

0

위의 코드의 문제는 줄

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