문제

나는 기본적으로 OOP 스크립트를 작동하는 2000줄의 코드 두 줄에 불과하기 때문에 어리석다고 느끼는 문제에 봉착했습니다.

본격적으로 - 다양한 정보(이름, 주소, ID)를 제공하는 Entity 클래스가 있습니다.문제는 - ID 변경자(setter)가 적절한 값을 설정하더라도(cout 및 반환 값으로 테스트됨) 접근자는 항상 0을 반환한다는 것입니다.

// ID accessor
int Entity::ID() const {
    return _ID;     
}
// ID mutator
int& Entity::ID( int newID ) {
    if ( newID >= 0 ) {
        _ID = newID;
    }
    return _ID;
}

내 클래스는 다음과 같습니다(ID( int ) 메소드는 AgencyNetwork::createXXX()에서 호출되고 모든 toStr() 메소드(각 클래스의 끝에 있음)에서 사용됩니다):

엔터티.cpp, 에이전시네트워크.cpp, Agent.cpp

해결됨: 모든 연산자=에 ID 변경자를 추가하는 것을 잊었습니다.도움주신 모든 분들께 감사드립니다 :)

도움이 되었습니까?

해결책

가장 주목할만한 것은 할당 연산자입니다. Entity 고장났습니다:

Entity& Entity::operator= ( const Entity& tocopy ) {
    delete this; // <<< don't do that 

    this -> name ( tocopy.name() );
    this -> address ( tocopy.address() );
    // <<< missing _ID

    return *this;
}

다른 팁

마술이 없습니다.평범한 버그가 있습니다.따라서 추적을 사용할 수 있습니다. 모든 '뮤 네이터'호출을 추적하십시오.Netomer 호출보다 다른 방법으로 _id 필드에 액세스 할 수 없는지 확인하십시오.추적 생성자, 복사 생성자, 복사 할당 연산자 및 소멸자 호출도 있습니다. 그런 다음 코드를 실행하고 추적 로그를 따르십시오. 모든 것이 당신의 경우에 분명해질 것이라고 확신합니다.

참고 : 위에서 언급 한 멤버 함수 중 일부를 그리워하는 경우 추적 전화로만 구성된 시체와 함께 정의해야합니다.

컴파일러가 클래스와 특히 _ID 필드를 완벽하게 제어하는지 확인하기 위해 컴파일러가 암시 적 멤버 함수 생성을 만들 수 없게해서는 안됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top