在实现list时所遇到的问题

简介: 在实现list时所遇到的问题

问题一:临时变量具有常性问题

在list中具体的场景:

在list中,iterator迭代器被封装成了类,iterator类中有 operator!= 这一重载函数

template <class T>
  struct __list_iterator
  {
    typedef list_node<T> Node;//结点重命名为Node
    __list_iterator(Node* node)
      :_node(node)
    {}
 
    bool operator!=( __list_iterator& it)
    {
      return _node!= it._node;
    }
    Node* _node;
  };

//iterator本质上还是一个指向Node类型的指针。

调用 operator!=

  tsj::list<int> lt1;
  lt1.push_back(1);
  lt1.push_back(2);
  lt1.push_back(3);
  tsj::list<int>::iterator it = lt1.begin();
  while (it != lt1.end())
  {
    (*it) += 1;
    cout << *it << " ";
    ++it;
  }
  cout << endl;

编译器会报错,如下:

我们不是写了!=的重载函数吗?报错说不匹配,那么只可能是参数不匹配。

实参是:lt1.end() ,形参是:__list_iterator& it

end()函数如下:

  template <class T>
  class list
  {
  public:
    typedef __list_iterator<T> iterator;
    typedef list_node<T> Node;
    list()
    {
      _head = new Node;
      _head->_prev = _head;
      _head->_next = _head;
    }
  
    iterator end()
    {
      return _head->_prev;
    }
  private:
    Node* _head;
  };

函数的返回方式有两类,一类是传值返回,一类是传引用返回。这里是传值返回。

传值返回的特点是,返回值会被寄存到一个临时对象中,函数调用结束后临时对象的内容再赋值给函数调用处,且临时对象具有常性。

那么问题找到了,end()的 返回值具有常性,而形参__list_iterator& it不具有常性。因此二者的类型不匹配,所以编译器才会报如上错误。

解决方法就是在__list_iterator& it前加上const。

问题二:单参数的构造函数支持隐式类型转换  

仍然是end()函数

_head->_prev 是指针,返回类型却是iterator,很显然二者类型不同。那他为什么可以传回去呢?上述过程等价于 __list_iterator& it=_head->_prev;上文已经提到,end()是传值返回,_head->_prev 的内容被存放到一个临时对象中,然后传递给__list_iterator& it,会调用__list_iterator中的拷贝构造函数,而拷贝构造函数的形参与_head->_prev类型一致。

对这部分总结一下:单参数的构造函数支持隐式类型转换  ,形如 __list_iterator& it=_head->_prev

看似两边的类型不同,本质上是由于=右边的类型与类的成员变量类型一致,因此会发生隐式类型转换。

相关文章
|
3天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
271 116
|
18天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
12天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
663 219
|
5天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
349 34
Meta SAM3开源:让图像分割,听懂你的话
|
10天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1576 157
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
897 61
|
7天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
295 140