【问题标题】:How can I make constructor take a non-const object?如何使构造函数采用非常量对象?
【发布时间】:2012-12-02 19:08:47
【问题描述】:

当谈到 C++ 中的 const 类型时,我总是迷失方向,而我的问题主要在于这些类型。

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

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

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

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

【问题讨论】:

  • 您为什么不向我们展示您的代码的相关部分?我认为这会使问题更容易理解。
  • 您的 Matrix 类应该为您的复制构造函数提供迭代器和常量迭代器以使用它们。如果您提供相关代码,我们可以给您一些想法。
  • 复制构造函数应该只是做,正如它的名字所说,它复制一些东西(相同类型的)而不会对源对象造成严重破坏。 Matrix、Matrix&、const Matrix& 是否有重载仅仅是关于歧义和性能。我想,您可能会在使用所有这些指针时遇到麻烦,因为您的迭代器似乎可用于修改之前由它构造的矩阵。因此,您需要复制实际数据以严格拥有资源或其他一些您想要的方法 - 我们称之为子矩阵。所以是的,你应该给我们看一些代码。

标签: c++ constructor type-conversion


【解决方案1】:

你必须将Matrix和iterator分开,这样只是迭代不会以任何方式改变Matrix,并且迭代所需的任何数据都存储在迭代器类中。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多