2009-11-18 235 views
0

我想初始化散列表。當我做股票的運營商=超載被稱爲。 我不確定我需要在這個功能中做什麼?初始化散列表C++

回答

1

您的賦值運算符不正確。簽名需要是:

stock& operator=(const stock& pRhs) 

其次,你需要先刪除然後捕獲數據。你現在只是刪除了NULL。最後,你應該應該s的數據,而不是設置爲NULL。


以下是如何實施operator=。您需要首先確保您擁有的任何數據都是免費的。之後,複製右側。

我沒有看到clear()的功能,但是你想要做的是把你的析構函數中的代碼,並將其移動到公共clear()函數。現在你所有的析構函數都調用這個函數,並且讓你在其他時候也清除哈希映射(不需要重複代碼)。

一個典型的天真的方法是類似如下:(我不會給你實際代碼,只是類似的東西):

// note, T is the type being copied. remember, this is just 
// generic helper code, it's up to you to fill in your blanks 

// returns a reference, common, allows chaining: a = b = c 
T& operator=(const T& pRhs) // rhs stands for right-hand-side 
{ 
    if (this != &pRhs) // avoid self-copy 
    { 
     clear(); // important! free resources before we copy 

     // code to copy pRhs. this 
     // is dependent on your class 
    } 
} 

,上面寫着「代碼複製pRhs的線條「將被您的拷貝構造函數中的相同代碼所取代。但是我們不能調用複製構造函數!這意味着您最終將複製粘貼該代碼,並且您應該從不複製粘貼代碼。這是因爲代碼重複是一件壞事。您可以嘗試通過創建私有copy()函數來緩解此問題,並且同時使用複製構造函數和operator=來調用此函數,但這不是最佳的,並且可能看起來很亂。

但是,有一個更好的方法。它要求您爲您的班級創建一個swap()功能。這是什麼功能是負責做的是通過交換他們所有的成員變量交換兩個類:

#include <algorithm> // for std::swap 

// somewhere in the class: 
void swap(T& pRhs) 
{ 
    // obviously the variable names depend on your class 
    std::swap(someVariable, pRhs.someVariable); 

    // and so on for all the variables in the class 
} 

現在,您可以在邏輯上通過調用classA.swap(classB)交換兩個班。你還需要一個工作拷貝構造函數。我們要做的就是讓編譯器爲我們製作一份副本,使用copy-constructor,然後用一塊石頭殺死兩隻鳥並與之交換。這裏就是我的意思是:

T& operator=(const T& pRhs) 
{ 
    if (this != &pRhs) 
    { 
     T temp = pRhs; // copy using copy-constructor 
     swap(temp); // swap with the copy 
    } 
} 

就是這樣!通過複製,編譯器將使用我們的copy-constructor;這是避免了代碼重複。

第二部分是swap與該副本。我們把所有的東西都複製下來,然後把東西拿出來。我們現在是副本(複製完成)。

最後一件事是確保我們所有的資源得到釋放。在我們致電clear()之前,現在它自動完成。這是因爲需要在函數結束之前銷燬temp。所以編譯器爲我們做了這些,但是請記住我們將我們的東西換成了temp。這意味着編譯器將最終解除分配舊數據,同時保留複製的數據。

那就是如何實現operator=。當然可以隨時提問。

+0

您應該仍然可以添加功能。也許讓他們私密? – GManNickG 2009-11-18 06:40:40

+0

另外,如果's-> name'不是空終止的,那麼'strlen'可能會崩潰。確保你的字符串都是正確初始化的。 – GManNickG 2009-11-18 07:02:46

+0

你的權利我可能會做一個功能,並使他們私密。明天我會試試。 「 – Steller 2009-11-18 07:47:34