初始化散列表C++
您的赋值运算符不正确。签名需要是:
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=
。当然可以随时提问。
您应该仍然可以添加功能。也许让他们私密? – GManNickG 2009-11-18 06:40:40
另外,如果's-> name'不是空终止的,那么'strlen'可能会崩溃。确保你的字符串都是正确初始化的。 – GManNickG 2009-11-18 07:02:46
你的权利我可能会做一个功能,并使他们私密。明天我会试试。 “ – Steller 2009-11-18 07:47:34