2012-07-09 4 views
0
나는 ++ C의 내 (매우 제한) 지식을 새로 고침 및 병합 검색 방법 구현하려고 시도

: "액세스와C++ : 포함하는 클래스 자체의 객체 초기화

class Sorter 
{ 
protected: 
    vector<int> v; 
public: 
    Sorter(){}; 
    Sorter(vector<int> input_vector); 
    virtual void sort() = 0; 
};  

Sorter::Sorter(vector<int> input_vector) 
{ 
    v.assign(input_vector.begin(), input_vector.end()); 
} 
class MergeSorter : public Sorter 
{ 
public: 
     MergeSorter():Sorter(){}; 
     MergeSorter(vector<int> input_vector):Sorter(input_vector){}; 
     vector<int> sorted_v; 
     MergeSorter* left; 
     MergeSorter* right; 
     void merge(); 
     void sort(); 
}; 

void MergeSorter::sort() 
{ 
    if(v.size() <= 1) 
     return; 
    int mid = int(v.size()/2); 
    left->v.assign(v.begin(), v.begin() + mid); 
    right->v.assign(v.begin() + mid, v.end() + 1); 
    left->sort(); 
    right->sort(); 
    left->v.assign(left->sorted_v.begin(), left->sorted_v.end()); 
    right->v.assign(right->sorted_v.begin(), right->sorted_v.end()); 
    merge(); 
    return; 
} 
... 

그것은 컴파일 않습니다, 그러나 프로그램 충돌 위반 위치를 읽는 중입니다. "라는 메시지를 left->v에 지정하려고합니다. 실제로 객체 left (및 right)을 먼저 생성해야하지만 같은 클래스의 객체이기 때문에 어디서 그 객체를 만들지는 모릅니다.

+0

"같은 계급"을 어떤 종류의 장애물로 인식하는 것 같습니다. 왜? 이 상황에 대해 특별한 것은 없습니다. 확인을 해 주셔서 감사합니다. – AnT

답변

0

실제로 객체를 왼쪽 (오른쪽)으로 먼저 생성해야하지만, 같은 클래스의 객체이므로 어디에서 그 객체를 만들지는 알지 못합니다.

올바른 내용입니다. 이것들을 생성 할 때까지, 그들은 일렬 화되지 않기 때문에 "사용"될 수 없습니다. 생성자 내에서 왼쪽 및 오른쪽의 생성 및 할당을 수행하거나 생성자에서 NULL로 초기화하고 해당 시점에서 설정되지 않은 경우 처음 사용하기 전에 설정해야합니다.

무한 루프가 발생하는 방식으로 생성자를 생성하지 않도록주의해야합니다. 생성자 내에 새 인스턴스를 만들고 차례대로 새 인스턴스를 만듭니다.

+0

. 사실 이미 생성자에서'new' 루프를 거쳤습니다 :) 이제는 왼쪽에 NULL을 추가하려고했습니다. 오른쪽 = NULL을; 그리고 그것도 작동하지 않았다 ... – Katya

+0

@Katya 당신이 그들을 NULL로 설정하면, 그들이 사용하기 전에 그들이 null인지 확인하고 필요에 따라 그들을 구성 할 수 있습니다. –

+0

힌트를 보내 주셔서 감사합니다. (방금 '해결'표시하는 것을 잊었습니다) – Katya