我真的无法弄清楚为什么我会收到这些错误:
这是我正在做的计划。
标题文件:
#pragma once
#include <iostream>
using namespace std;
template <class Type>
class Node
{
private:
Type info;
Node<Type> *link;
public:
// Constructors
Node();
Node(const Type& elem, Node<Type> *ptr);
Node(const Node<Type> &otherNode);
// Destructor
~Node();
// Mutators and Accessors (getters and setters)
void setInfo(const Type& elem);
Type getInfo() const;
void setLink(Node<Type> *ptr);
Node<Type> * getLink() const;
// Overload the assignment operator
const Node<Type> & operator=(const Node<Type>&);
};
template <class Type> Node<Type>::Node()
{
link = NULL;
}
template <class Type> Node<Type>::Node(const Type& elem, Node<Type> *ptr)
{
info = elem;
link = ptr;
}
template <class Type> Node<Type>::Node(const Node<Type> &otherNode)
{
otherNode.setInfo(info); //ERROR 1
otherNode.setLink(link); // ERROR 2
}
template <class Type> Node<Type>::~Node()
{
// fill in this
}
template <class Type> void Node<Type>::setInfo(const Type& elem)
{
info = elem;
}
template <class Type> Type Node<Type>::getInfo() const
{
return info;
}
template <class Type> void Node<Type>::setLink(Node<Type> *ptr)
{
link = ptr;
}
template <class Type> Node<Type> * Node<Type>::getLink() const
{
return link;
}
template <class Type> const Node<Type> & Node<Type>::operator=(const Node<Type>& n)
{
info = n.info;
link = n.link;
}
主档案:
include "Node.h"
#include <string>
#include <iostream>
using namespace std;
int main()
{
Node<string> *node1 = new Node<string>();
node1->setInfo("Hello");
Node<string> *node2 = new Node<string>("Hello World!", node1);
Node<string> *node3 = new Node<string>(*node2);
Node<string> *node4 = new Node<string>();
node4->setInfo("Foo Bar");
node4->setLink(node3);
cout << node3->getLink()->getInfo() << endl; // should return "hello world"
system("pause");
return 0;
}
答案 0 :(得分:1)
问题是您正在尝试修改常量对象。您的构造函数声明是
template <class Type> Node<Type>::Node(const Node<Type> &otherNode)
const
表示您无法修改otherNode
对象。您只能在otherNode
上调用标记为const
的方法。在您的身体中,您尝试修改otherNode
对象:
otherNode.setInfo(info); //ERROR 1
otherNode.setLink(link); // ERROR 2
在这种情况下,我认为正确声明otherNode
为const
可以帮助您避免另一个问题。看起来您的复制构造函数实际上是将“新”节点复制到源节点中,而不是相反。
答案 1 :(得分:0)
抓出我之前的回答,因为它已经过时了 我有一个编译器,我看到发生了什么。
在复制构造函数中,传入一个const引用,然后尝试修改该const引用。
相反它应该看起来像
template <class Type> Node<Type>::Node(const Node<Type> &otherNode)
{
this->setInfo(otherNode.info);
this->setLink(otherNode.link);
}
答案 2 :(得分:0)
还有一个问题。您的赋值运算符不会返回节点引用。它没有任何回报。因此,如果调用了复制赋值,程序将调用未定义的行为。
template <class Type> const Node<Type> & Node<Type>::operator=(const Node<Type>& n)
{
info = n.info;
link = n.link;
// so what happened to the return value?
// return *this; // You're missing this.
}
但是,如果这是你的赋值算子,那么为什么有一个呢?您正在做的就是编译器生成的版本将执行的操作,而这只是对所有成员执行浅层复制。