그 질문 제목은 한입입니다. 기본적으로 벡터 내에서 이중 연결 목록을 사용하는 해시 테이블 구조를 만들고 있습니다. 오버로드 된 생성자를 사용하여 개체를 만들면 모든 것이 잘 작동하지만 기본 생성자를 사용하면 main으로 돌아온 후 개체의 상태가 펑키하게됩니다.
내 생성자 :
HashTable::HashTable()
{
HashTable(53);
}
HashTable::HashTable(int tableSize)
{
currentSize = tableSize;
table.resize(tableSize);
}
개체 생성 후 중단 점 설정
HashTable ht(size); //this works
HashTable ht; //this does not work
코드를 단계별로 살펴보면 오버로드 된 생성자가 정상적으로 호출되는 것을 알 수 있지만 main으로 돌아간 다음 테이블을 사용하려고 시도하면 (기본 생성자 만 사용하는 경우) 벡터의 크기와 변수 currentSize가 잘못되었습니다.
객체를 생성 한 후 메인으로 돌아 가기 전 :
currentSize = 53
table [size] = 53, [capacity] = 53, empty linked lists fill the vector
ht.hash(value)
main에서 호출 할 때 객체는 이제 다음을 갖습니다.
currentSize = -858993460
table [size] = 0, [capacity] = 0, linked lists obviously gone.
특히 코드 경로가 모두 작동하기 때문에 벡터가 자체적으로 0으로 재설정되고 개인 int currentSize가 펑키하게되는 원인은 무엇입니까 HashTable(int tableSize)
?
@dyp 올바른 방향으로 나를 가리 켰습니다.
HashTable(53);
임시 로컬 개체를 만드는 중이었습니다-기본 개체를 원하는 크기 인 53으로 설정하지 않았습니다.
임시 개체를 만드는 대신 기본 개체에서 오버로드 된 생성자를 호출하려면 this->HashTable::HashTable(53);
Visual Studio에서 오버로드 된 생성자가 호출 개체에서 호출되도록 강제했습니다.
편집 : gcc 컴파일러는 이것을 금지하며 컴파일러가 허용하는지 여부에 관계없이 일반적으로 나쁜 습관으로 간주됩니다.
이니셜 라이저 목록 HashTable::HashTable() : HashTable(53) {}
은 내가하려는 작업을 수행하는 올바른 방법으로 간주됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다