白杨木の影子 2022-01-21 03:37 采纳率: 100%
浏览 685
已结题

刚开始学数据结构与算法,编译出现错误:[Error] candidate is: virtual int& chain::get(int) const,什么问题呢?

  1. #include<iostream>
  2. #include<fstream>
  3. using namespace std;
  4. //链表节点的结构定义
  5. struct chainNode
  6. {
  7. //数据成员
  8. int element;//数据域
  9. chainNode* next;//指针域
  10. //方法:构造函数形成重载
  11. chainNode(){}
  12. chainNode(const int& element)
  13. {
  14. this->element=element;
  15. }
  16. chainNode(const int& element,chainNode* next)
  17. {
  18. this->element=element;
  19. this->next=next;
  20. }
  21. };
  22. class linearList
  23. {
  24. public:
  25. virtual ~linearList(){};
  26. virtual bool empty()const=0;
  27. virtual int size()const=0;
  28. virtual int& get(int theIndex)const=0;
  29. virtual int indexOf(const int& theElement)const=0;
  30. virtual void erase(int theIndex)=0;
  31. virtual void insert(int theIndex,const int& theElement)=0;
  32. virtual void output(ostream& out)const=0;
  33. };
  34. class chain:public linearList
  35. {
  36. public:
  37. //构造函数,复制构造函数和析构函数
  38. chain(int initCapacity=10);
  39. chain(const chain&);
  40. ~chain();
  41. //方法
  42. bool empty()const
  43. {
  44. return listSize==0;
  45. }
  46. int size()const
  47. {
  48. return listSize;
  49. }
  50. int& get(int theIndex)const;
  51. int indexOf(const int& theElement)const;
  52. void erase(int theIndex);
  53. void insert(int theIndex,const int& theElement);
  54. void output(ostream& out)const;
  55. private:
  56. chainNode* firstNode;//指向链表第一个节点的指针,也是链表的唯一对外接口
  57. int listSize;//线性表的元素个数
  58. };
  59. //链表的构造和复制构造函数
  60. chain::chain(int initCapacity)
  61. {
  62. //构造函数
  63. //判断是否合法
  64. if(initCapacity<1)
  65. {
  66. cout<<"Initial Capacity = "<<initCapacity<<" must be > 0"<<endl;
  67. return;
  68. }
  69. firstNode=NULL;
  70. listSize=0;
  71. }
  72. chain::chain(const chain& theList)
  73. {
  74. //复制构造函数
  75. listSize=theList.listSize;
  76. if(listSize==0)
  77. {
  78. //如果原链表为空
  79. firstNode=NULL;
  80. return;
  81. }
  82. //链表theList非空
  83. chainNode* sourceNode=theList.firstNode;
  84. //先复制首元素
  85. firstNode=new chainNode(sourceNode->element);//为新链申请一块新的内存空间
  86. sourceNode=sourceNode->next;
  87. chainNode* targetNode=firstNode;//创建targetNode的原因是:链表必须有firstNode,不可以直接使用它
  88. //到了此处,targetNode指向新链的第一个节点;sourceNode指向原链的第二个节点,错开一个节点才可以实现复制
  89. while(sourceNode!=NULL)
  90. {
  91. //复制剩余元素
  92. targetNode->next=new chainNode(sourceNode->element);
  93. //此节点复制完成,指针向后移动1
  94. targetNode=targetNode->next;
  95. sourceNode=sourceNode->next;
  96. }
  97. //节点全部复制完成,尾节点指针域还要指向空
  98. targetNode->next=NULL;
  99. }
  100. chain::~chain()
  101. {
  102. //链表的析构函数,删除链表的所有节点(销毁链表)
  103. //算法思想:重复清除链表的首节点,直到链表为空,在清除首节点之前必须用变量nextNode保存第二个节点的指针,否则无法找到下一个节点的地址
  104. while(firstNode!=NULL)
  105. {
  106. //删除首节点
  107. chainNode* nextNode=firstNode->next;
  108. delete firstNode;
  109. firstNode=nextNode;
  110. }
  111. }
  112. //方法get:返回索引为theIndex的元素(数据域)
  113. int& chain::get(const int theIndex)const
  114. {
  115. //若该元素不存在
  116. if(theIndex<0||theIndex>listSize-1)
  117. {
  118. cout<<"out of range!"<<endl;
  119. return -1;
  120. }
  121. chainNode* currentNode=firstNode;//需要新开一个指针,不可以直接改变firstNode
  122. for(int i=0;i<theIndex;i++)
  123. {
  124. currentNode=currentNode->next;
  125. }
  126. return currentNode->element;
  127. }
  128. //方法indexOf:返回元素theElement首次出现时的索引
  129. int chain::indexOf(const int& theElement)const
  130. {
  131. chainNode* currentNode=firstNode;
  132. int index=0;
  133. while(currentNode!=NULL&&currentNode->element!=theElement)//结束条件1:遍历完没有找到;结束条件2:找到了
  134. {
  135. index++;
  136. currentNode=currentNode->next;
  137. }
  138. //确定是否找到
  139. if(currentNode==NULL)
  140. {
  141. return -1;
  142. }
  143. else
  144. {
  145. return index;
  146. }
  147. }
  148. //方法erase:删除索引为theIndex的元素
  149. //三种情况:1、theIndex<0或者theIndex>=listSize,没有这个位置上的元素,或者链表为空
  150. //2、删除非空表的第0个元素节点
  151. //3、删除其他元素节点
  152. void chain::erase(int theIndex)
  153. {
  154. //索引无效
  155. if(theIndex<0||theIndex>=listSize)
  156. {
  157. cout<<"out of range!"<<endl;
  158. return;
  159. }
  160. //索引有效
  161. chainNode* deleteNode;
  162. if(theIndex==0)
  163. {
  164. //删除链表首节点
  165. deleteNode=firstNode;
  166. firstNode=firstNode->next;
  167. }
  168. //删除其他节点
  169. else
  170. {
  171. //用指针p指向要删除节点的 前驱节点(如果是双向链表,则可以直接指到被删除节点)
  172. chainNode* p;
  173. for(int i=0;i<theIndex-1;i++)
  174. {
  175. p=p->next;
  176. }
  177. deleteNode=p->next;
  178. p->next=p->next->next;//删除deleteNode指向的节点
  179. }
  180. listSize--;//链表节点个数减一
  181. delete deleteNode;
  182. }
  183. //方法insert:在索引为theIndex的位置插入一个新元素(过程和erase类似)
  184. void chain::insert(int theIndex,const int& theElement)
  185. {
  186. //索引无效
  187. if(theIndex<0||theIndex>=listSize)
  188. {
  189. cout<<"out of range!"<<endl;
  190. return;
  191. }
  192. //索引有效
  193. //在表头插入
  194. if(theIndex==0)
  195. {
  196. //最简单的方法就是用前面类中的构造函数
  197. firstNode=new chainNode(theElement,firstNode);//太妙了!!!
  198. }
  199. else
  200. {
  201. //寻找新元素的前驱
  202. chainNode* p;
  203. for(int i=0;i<theIndex-1;i++)
  204. {
  205. p=p->next;
  206. }
  207. // chainNode<T>* addNode=new chainNode<T>(theElement);
  208. // addNode->next=p->next;
  209. // p->next=addNode;
  210. p->next=new chainNode(theIndex,p->next);
  211. }
  212. listSize++;//链表元素个数加一
  213. }
  214. int main()
  215. {
  216. chain c(1);
  217. c.insert(0,1);
  218. return 0;
  219. }

错误提示是在get函数实现里面的return -1;
哪里有问题呢?
我把return -1注释掉的话就出现错误:[Error] ld returned 1 exit status

展开全部

  • 写回答

3条回答 默认 最新

  • [PE]经典八炮 2022-01-21 05:03
    关注

    哈哈,返回引用意味着可能修改内部变量,所以和const矛盾,要么改成const int &或者直接int,要么去掉后面的函数修饰符const

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    [PE]经典八炮 2022-01-21 05:04

    我推荐去掉后面的函数修饰符,因为去掉之后可以允许使用a.get(2)=10;这样的代码,你好像也没有专门的set函数

    回复
    白杨木の影子 2022-01-21 06:41

    谢谢谢谢,懂了!

    回复
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 1月28日
  • 已采纳回答 1月21日
  • 创建了问题 1月21日

悬赏问题

  • ¥15 KeiI中头文件找不到怎么解决
  • ¥15 QT6将音频采样数据转PCM
  • ¥15 本地安装org.Hs.eg.dby一直这样的图片报错如何解决?
  • ¥15 下面三个文件分别是OFDM波形的数据,我的思路公式和我写的成像算法代码,有没有人能帮我改一改,如何解决?
  • ¥15 Ubuntu打开gazebo模型调不出来,如何解决?
  • ¥100 有chang请一位会arm和dsp的朋友解读一个工程
  • ¥50 求代做一个阿里云百炼的小实验
  • ¥15 查询优化:A表100000行,B表2000 行,内存页大小只有20页,运行时3页,设计两个表等值连接的最简单的算法
  • ¥15 led数码显示控制(标签-流程图)
  • ¥20 为什么在复位后出现错误帧
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部