如何使构造函数接受一个非常量对象

How can I make constructor take a non-const object?

本文关键字:一个 非常 常量 对象 构造函数 何使      更新时间:2023-10-16

当谈到C++中的常量类型时,我总是会迷失方向,而我的问题本质上是这些类型。

我有以下情况:我有一个类Matrix,本质上是一个二维链表(一个带哨兵的环)和一个类似迭代器的类,它可以选择一行(选择行的方法),然后遍历它(运算符++)。为了获得这一点,迭代器存储了3个指针:主哨兵、选定子列表(行)的哨兵和当前选定的节点(让我们将其命名为插入符号)。如果运算符++命中子列表sentinel,则到达行的末尾,如果行选择命中主sentinel则到达矩阵的末尾。

现在,由于列表是单独链接的,并且我希望我的迭代器提供删除功能,所以我决定将当前节点字段的Node**类型存储在迭代器中。但这会给构造函数带来一些问题。

我决定只允许使用两种类型的构造函数——一种采用Matrix,另一种采用其他迭代器。这是我的问题。从矩阵创建的迭代器的初始状态将其所有指针都放在同一点上——main sentinel。现在,从g++告诉我的内容来看,接受Matrix的构造函数必须接受类型const Matrix&。但如果是这样的话,我就不能为我的插入符号(Node**)分配指向矩阵自己指针的指针,因为它是常量,而插入符号不能是常量。

我怎么可能解决这个问题?为什么构造函数不能接受非常量实体?我可以在构造函数中将矩阵从常量转换为非常量吗?提前感谢您的任何提示。

您必须将矩阵和迭代器分开,这样仅仅迭代不会以任何方式改变矩阵,并且迭代所需的任何数据都存储在迭代器类中。

此外,如果您需要迭代器对const Matrix对象进行操作,则还需要提供一个const迭代器,该迭代器可以具有指向Matrix的const引用/指针。但在复制构造函数中,您不一定需要这个,您可以直接访问字段,毕竟这是同一个类。

为了让迭代器类访问Matrix的内部,您可以使用friend关键字,或者(最好)您可以让迭代程序类成为Matrix的内部类。