C++ int 접근자는 mutator가 올바르게 설정된 경우에도 0을 반환합니다.
-
29-10-2019 - |
문제
나는 기본적으로 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
필드를 완벽하게 제어하는지 확인하기 위해 컴파일러가 암시 적 멤버 함수 생성을 만들 수 없게해서는 안됩니다.