对于C ++中的const类型,我总是迷失方向,而我的问题基本上就是这些。
我有以下情况:我有一个类Matrix基本上是一个二维链表(带有哨兵的环)和类似迭代器的类,可以选择一行(选择一行的方法)和然后通过它(运算符++)。为了获得它,迭代器存储3个指针:主要的哨兵,所选子列表(行)的哨兵和当前选择的节点(让我们将其命名为插入符号)。如果operator ++命中sublist sentinel - 然后到达行的末尾,如果行选择击中主要的sentinel,那么我们已到达矩阵的末尾。
现在,因为列表是单链接的,并且我希望我的迭代器提供删除功能,所以我决定在迭代器中为我当前的节点字段存储Node**
类型。但这会给构造函数带来一些问题。
我决定只允许两种类型的构造函数 - 一种采用Matrix,另一种采用其他迭代器。这是我的问题。从矩阵创建的迭代器的初始状态使其所有指针都在同一点 - 主要的哨兵。现在,似乎g ++告诉我,我的构造函数Matrix
必须采用类型const Matrix&
。但是如果是这样的话,我不能为我的插入符号(Node**
)分配指向Matrix自己指针的指针,因为它将是const而插入符号不能是const。
我怎么可能解决这个问题?为什么构造函数不能采用非const实体?我可以在构造函数中将我的Matrix从const转换为非const吗?提前感谢任何暗示。
答案 0 :(得分:1)
您必须将Matrix和迭代器分开,以便迭代不会以任何方式更改Matrix,并且迭代所需的任何数据都存储在迭代器类中。
此外,如果需要迭代器来操作const Matrix对象,还需要提供一个const迭代器,然后可以使用const引用/指向Matrix的指针。但是在复制构造函数中你不一定需要这个,你可以直接访问字段,毕竟它是同一个类。
要为迭代器类提供对Matrix内部的访问权限,可以使用friend关键字,或者(最好)可以使迭代器类成为Matrix的内部类。