【问题标题】:copy constructor of a linked list class链表类的复制构造函数
【发布时间】:2015-02-15 03:08:07
【问题描述】:

我有一个链表类List。我必须为它创建一个复制构造函数。我实际上遇到了语法问题。这是我的代码:

template <class T>
List<T>::List(const List<T>& otherList)
{
}

otherList 是 List 类型的另一项。事实上,我认为它是一个指向列表的指针。我为 List 类定义了一个 getHead() 函数,它工作正常。 我认为执行以下操作就可以了:

Node* temp = otherList->getHead();

node 是组成 List 的指针。这是一个单独的类节点。 但执行上述操作会出现错误:

base operand of -> has non-pointer type const List<int> 

所以我尝试使用“。”而不是上面表达式中的“->”。得到以下错误:

passing const List<int> as this argument of ListItem<T>* List<T>::getHead() [with T = int] discards qualifiers [-fpermissive]

我的 getHead 函数:

template <class T>
node<T>* List<T>::getHead()
{
return head;
}

请指导我

【问题讨论】:

  • 是什么让你认为它是指针?
  • 外部列表引用为 const。因此您只能使用它的 const 成员,并且您从中检索到的数据成员是相同的。

标签: c++ linked-list


【解决方案1】:

首先,otherList 不是指针,它是“对const List&lt;T&gt; 的引用”。我们知道它是一个引用,因为它的类型中有 &amp;。如果它是一个指针,它的类型中会有一个*。引用的行为就像您刚刚拥有对象本身一样。所以使用.访问其成员函数getHead是正确的。

现在的问题是你有一个const 引用,但你调用的是一个非const 成员函数。就编译器而言,您的getHead 函数可能会修改List,因此不应在const List 上调用。您需要将getHead 声明为const。无论您有getHead 的声明,在开始函数的{ 之前粘贴const

template <typename T>
const Node<T>* List<T>::getHead() const {
  // ...
}

这假定getHead 实际上并没有修改列表(它不应该)。如果是这样,那么您不能将其设为const 成员函数,也不能从复制构造函数中调用它,因为otherListconst。但是,您的复制构造函数不应该修改它正在复制的对象,所以您的 otherList 应该const

【讨论】:

  • 我做了你所指出的。但我得到了同样的错误:
  • 传递 const List 作为 ListItem* List::getHead() [with T = int] 的这个参数会丢弃限定符 [-fpermissive]
  • +1,对不起,兔子,这可能应该是const List&lt;T&gt;::Node*,但同样,没有来自 OP 的代码,很难说。假设NodeList&lt;T&gt; 的嵌套类,那将是正确的。否则你所拥有的是。
  • Node 是一个类,链表类包含 node* 头,然后链接到更多的 node* 。
  • @khurramusman 那么这段代码是正确的,你的目标指针应该在你的copy-ctor中声明为const Node&lt;T&gt;*
【解决方案2】:

我觉得应该将getHead() 声明为 const 函数...试试看,让我们知道它是否有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多