2012-12-14 48 views
2

当谈到C++中的const类型时,我总是会迷失方向,而我的问题实质上就在于这些。我怎样才能使构造函数采取非const对象?

我遇到了以下情况:我有一个类Matrix基本上是一个二维链表(带有哨兵的环)和一个类似迭代器的类,它可以选择一行(选择行的方法)然后通过它(操作符++)。为了获得这个结果,迭代器存储3个指针:主标记,选定子列表(行)的标记和当前选定的节点(让我们将其命名为插入)。如果operator ++命中子列表sentinel - 那么到达一行的结尾,如果行选择命中主标记,那么我们已经到达矩阵的末尾。

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

我决定只允许两种类型的构造函数 - 一种取矩阵,一种取其他迭代器。这是我的问题。从矩阵创建的迭代器的初始状态将其所有指针指向同一点 - 主标记。现在,似乎从g ++告诉我,我的构造函数采取Matrix必须采取const Matrix&类型。但是如果是这样的话,我不能指定我的脱字符号(Node**)指向Matrix自己的指针,因为它是常量,而脱字符不能是const。

我该如何解决这个问题?为什么构造函数不能使用非const实体?我可以在构造函数中将矩阵从const转换为非const吗?在此先感谢您的任何提示。

+0

你为什么不告诉我们你的代码的相关部分?我认为这会让问题更容易理解。 – NPE

+1

你的Matrix类应该为你的拷贝构造函数提供迭代器和常量迭代器来处理它们。如果你提供了相关的代码,我们可以给你一些想法。 – didierc

+0

复制构造函数应该这么做,它的名字是什么,它复制了一些(相同类型的)而不会对源对象造成严重破坏。无论您是否有Matrix,Matrix&,const Matrix的重载,仅仅是含糊不清和性能。我想,你可能会遇到所有这些指针的麻烦,因为看起来,你的迭代器可以用来修改一个矩阵,它是由它构造的。因此,您需要复制实际数据以获取严格的资源所有权或其他方法,以满足您的需求 - 我们称之为子矩阵。所以是的,你应该给我们看一些代码。 – Sam

回答

1

您必须将Matrix和迭代器分开,这样只是迭代不会以任何方式更改Matrix,并且迭代所需的任何数据都存储在迭代器类中。此外,如果您需要迭代器对常量矩阵对象进行操作,则还需要提供一个常量迭代器,该迭代器可以具有常量引用/指向矩阵的指针。但是在复制构造函数中,你不一定需要这个,你可以直接访问字段,它毕竟是同一个类。

要让迭代器类访问Matrix的内部,可以使用friend关键字,或者(最好)可以使迭代器类的Matrix内部类。

相关问题