我在为哈希表编写复制构造函数时遇到问题。我已经遇到了仅包含链接对象的复制构造函数的问题。如何使用以下函数实现复制构造函数和赋值运算符:
//copy constructor
Apple::Apple(const Apple& anotherApple){
}
//assignment operator
Apple& Apple::operator = (const Apple& anotherApple){
}
我知道这将是:
tableSize = anotherApple.tableSize;
count = anotherApple.count;
array = new *anotherApple.array; //idk if this is right for dynamically created array of pointers
答案 0 :(得分:1)
function redirect_to_customer($result = [], $redirect_url = "")
{
$html = '<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body onload="closethisasap();">
<form name="redirectpost" method="POST" action="' . $redirect_url . '">
';
if (!is_null($result)) {
$result = json_encode($result,true);
$html .= '<input type="hidden" name="result" value="' . str_replace('"', "'", $result) . '"> ';
}
$html .= "
</form>
</body>
<script type=\"text/javascript\">
function closethisasap() {
document.forms[\"redirectpost\"].submit();
}
</script>
</html>";
echo $html;
}
答案 1 :(得分:1)
理论上,您的复制构造函数可以在循环中编写,前提是从哈希表中检索并向哈希表添加值时存在正确的函数。如果这些函数目前不存在,那么无论如何你都要编写这些函数会更有价值,因为如果没有办法迭代所有的值,哈希表就会非常严格。
假设您有这样的功能,您可以在Node*
函数中检索get
。还假设getFirst()
检索头节点,getNext()
检索下一个节点,给定Node*
值开始。复制构造函数看起来像这样:
Apple::Apple(const Apple& anotherApple)
{
Node* curNode = anotherApple.getFirst();
while (curNode)
{
addValue(curNode->key, curNode->value);
curNode = anotherApple.getNext(curNode);
}
}
这要求您的实现有一种方法可以使用getFirst()
之类的东西获取表中的第一个值,并通过名为getNext()
的函数迭代到当前节点的下一个条目。如果没有更多节点,则getNext()
将返回NULL。
以这种方式编写复制构造函数的好处是,您可以重用希望已经过测试的代码,即addValue
函数,而不必再次重写addValue
。此外,几乎没有发生错误的可能性,因为您只是调用已存在的函数。
以这种方式编写复制构造函数的缺点是,runtiime方面的复杂性可能比尝试使用大量指针操作“从头开始”创建整个内部构件要慢(就像之前的答案之一那样) 。
所以权衡差异,安全超速。也许使用安全方法没有速度问题。
对于赋值运算符,如果你有一个工作副本构造函数和一个有效的析构函数,那么这就是你需要做的:
#include <algorithm>
//...
Apple& Apple::operator=(const Apple& anotherApple)
{
Apple temp(anotherApple);
std::swap(temp.array, array);
std::swap(temp.tableSize, tableSize);
std::swap(temp.count, count);
return *this;
}
这使用copy / swap idiom。同样,这需要一个正确的复制构造函数和一个正确的析构函数(在这两个函数中没有任何错误)。