2012-07-09 23 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 2012-07-09 16:31:25

回答

0

我覺得我需要先實際創建一個對象左(右),但不知道我在哪裏做,因爲它是同一個類的對象。

這是正確的。直到你創造這些,他們不能被「使用」,因爲他們將是無形的。你應該能夠在你的構造函數中構造和賦值左或右,或者在構造函數中將它們初始化爲NULL,並且在第一次使用之前將它們設置爲未設置。

請注意,您將需要注意不要以一種會導致無限循環的方式構建這些方法 - 在構造函數中創建一個新實例,然後創建一個新實例,然後依次創建一個新實例....

+0

感謝您的確認。我實際上已經通過構造函數中的'new'循環:)試圖現在添加'left = NULL; right = NULL;'它也沒有工作... – Katya 2012-07-09 16:04:33

+0

@Katya如果你將它們設置爲NULL,你需要在使用前檢查它們是否爲空,並根據需要構造它們。 – 2012-07-09 16:08:33

+0

感謝您的提示 - 它在最後工作! (只是忘記標記'已解決') – Katya 2012-07-12 06:31:13