2017-04-23 40 views
1

所以我創建一個封閉的散列哈希表一類的載體的情況下,我有一個結構C++段故障解除引用的指針結構

struct Example { 
    string key; 
    string data; 

    Example() { key = "000"; } 
}; 

和一個類,其中包含一個部件,其分到一個結構向量,一個構造函數和一個我將用來說明問題的函數。

class hash_table { 
    private: 
    vector<Example>* hash; 

    public: 
    hash_table(int size); 
    void dummy_method(); 
}; 

它意味着根據用戶/文件輸入動態分配向量中的結構數量。

hash_table :: hash_table (int size=10) 
{ 
    //initialize vector 
    vector<Example> * hash = new vector<Example>(size); 
    //test objects 
    for(int i=0;i<size;i++) 
    cout<<(*hash)[i].key<<endl; 
} 

上述代碼出現初始化10個成員,它打印出「000」 十倍。

然而,當我嘗試通過調用dummy_method-

void hash_table::dummy_method() { 
    cout<<(*hash)[0].key<<endl; 
} 

我得到一個分段錯誤

我敢肯定,這甚至不是這樣做的正確的方式,但我我一直在尋找/修補,我似乎無法找到解決方案。然而,我絕對必須使用指向結構向量的指針,而且我很確定我應該動態地分配每個結構(以某種方式)。謝謝你的幫助。

(也,是的,我們確實有使用的命名空間,因此沒有任何地方STD)

+3

您應該存儲一個矢量,而不是指向矢量的指針。這將減少錯誤的範圍。 – juanchopanza

+0

什麼是「htable」?它是如何定義的?請發佈一個完整的示例代碼,重現您所問的問題。否則很難給出有用的答案。 – emlai

+0

抱歉,htable來自較大的程序。我將較大程序中的功能複製到較小的程序中,以便找出問題。我編輯它以反映正確的代碼。截至目前,這是一個完整的程序,所以任何問題都應該被隔離。 –

回答

2

vector<Example> * hash = new vector<Example>(size);表達將初始化一個局部變量名hash,不是hash_table::hash成員(這是未初始化)。

+0

非常感謝你澄清這一點。你知道是否有一種簡單的方法來動態初始化hash_table :: hash成員,並用動態分配的結構填充它?對不起,如果這是一個愚蠢的問題,我的大腦有點難以想象全部。 –

+0

您只需要移除'vector *'部分,甚至將其重寫爲'this-> hash'來明確表明您正在處理類成員。像這樣的名字衝突在C++中是非常麻煩的,你可能想要使用一些命名約定來防止這種情況,比如成員變量以'm_'開始,常規變量總是用lower_case寫成,函數總是用CamelCase寫成,類型名稱以't_',名字空間以'n_'開頭。 – VTT

+0

我知道在有人回答的時候我會感到難以置信的愚蠢,我沒有錯。我非常感謝幫助。 –