2014-04-12 2 views
0

그 질문 제목은 한 입 가득합니다. 기본적으로, 벡터 내에서 이중으로 연결된 목록을 사용하는 해시 테이블 구조를 만듭니다. 모든 오버로드 된 생성자를 사용하여 개체를 만들 때 잘 작동하지만 기본 생성자를 사용하면 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 

을 만든 후 중단 점을 설정하지만, 기본으로 돌아 다음에 시도 후 (기본 생성자 만 사용하는 경우) 테이블을 사용하면 벡터의 크기와 변수 currentSize가 잘못되었습니다.

메인으로 돌아 가기 전에, 객체를 생성 한 후 :

currentSize = 53 
table [size] = 53, [capacity] = 53, empty linked lists fill the vector 

주에서 ht.hash(value)를 호출, 개체가 지금 가지고 : 벡터가 0 자체를 재설정 원인이 무엇

currentSize = -858993460 
table [size] = 0, [capacity] = 0, linked lists obviously gone. 

내 특히 코드 경로가 모두 HashTable(int tableSize)을 통해 작동하므로 private int currentSize가 펑키가 될까요?

+1

'HashTable (53);'다른 생성자에 위임하지 않습니다. IIRC는 임시를 만듭니다. C++ 11에서는 HashTable :: HashTable() : HashTable (53) {}'(* 위임자 생성자 * 및/또는 * 멤버 초기 자 목록 * 검색)을 통해 다른 생성자에 위임 할 수 있습니다. – dyp

+0

@dyp - 감사합니다! 'this-> HashTable :: HashTable (53);'또는 이니셜 라이저 목록이 잘 작동했습니다 \t. – tloveless

+0

'this-> HashTable :: HashTable (53);'[함수 몸체 안에서 작동해서는 안됩니다 '] (http://coliru.stacked-crooked.com/a/93a68f895ed0e74c) oO 생성자가 정상이 아닙니다. 함수를 호출 할 수 있습니다. – dyp

답변

0

@dyp 올바른 방향으로 나를 가리 켰습니다.

HashTable(53);

는 임시 로컬 객체를 생성 한 - 53

내 원하는 크기로 주에서 개체를 설정하지 않는 주 내 개체의 오버로드 된 생성자를 호출하는 대신 임시 객체를 만들려면 this->HashTable::HashTable(53); 근무 (에 Visual Studio)를 호출하여 오버로드 된 생성자를 호출 객체에서 강제로 호출합니다.

EDIT : gcc 컴파일러는 이것을 금지하며 일반적으로 컴파일러가 허용하든 그렇지 않든 나쁜 관행으로 간주됩니다.

이니셜 라이저 목록을 HashTable::HashTable() : HashTable(53) {}으로 설정하면 올바른 작업을 수행 할 수 있습니다.

+0

* "조금 깨끗합니다."* 단지 비트가 아닙니다.컴파일러를 컴파일 한 방법을 알고 싶습니다. C++이 금지 한 이후로 (예 :'this-> HashTable :: HashTable (53);') (http://coliru.stacked-crooked.com/a/d55eafe2cda246d7) 생성자를 직접 호출 할 수 있습니다. 'HashTable :: HashTable() : HashTable (53) {}'은 유효한 C++ 11이며이 기능은 delegating constructor *이라고합니다. – dyp

+0

흠. 나는 C++이 생성자를 호출하는 것을 금지한다고 읽었다 :'Foo f; f.Foo();'- 클래스 선언 내에서 생성자가 오버로드 된 생성자를 호출 할 수 없다고 명시 적으로 언급하지 않은 것처럼 메소드를 선언 할 때 표준을 검토해야합니다. VS는 생성자 선언에 아무런 문제가 없으므로 gcc 예제와 다르게 어셈블됩니다. 그런 다음 다시 'Foo f'라고 부르지 않습니다. f.Foo()', 나는 단지'Foo f; 및 Foo f (int);'. – tloveless

+0

[* shrug *] (http://stackoverflow.com/q/23347437/420683) – dyp

관련 문제