7
blog blog::operator+(const blog * b)
{
    next = b; //blog * next; it's a next pointer in a doubly linked list.
    return * this;
}

我只是想知道是否有任何方法可以将 b 分配给当前节点的下一个指针。有什么不同的方法可以做到吗?现在我得到

invalid conversion from ‘const blog*’ to ‘blog*’ [-fpermissive]

回顾我的笔记,似乎建议我应该在进行运算符重载时使用常量,但现在它并没有真正编译。我如何能够将 const blog * b 转换为下一个指针?谢谢!

4

5 回答 5

8

从您的问题和评论中,我了解到您对const blog *.

您必须向后阅读指针类型。

  • blog *是一个指向博客的指针——你可以改变指针的值,你可以用指针改变指向的对象。
  • blog const *(and const blog *) 是指向 const blog 的指针 - 您可以更改指针值,但不能使用此指针更改对象。
  • blog * const一个指向博客的 const 指针——你不能改变指针的值,但你仍然可以用这个指针改变指向的对象。

混淆经常出现,因为你有两种类型来这里玩。指针的类型和指向的类型。两者都可以是常量。

使用您的接口,您operator+可以保证参数指向的对象不会被该指针更改(指向 const 博客的指针)。但是随后您将其分配给指向博客的指针,然后可以使用该指针来更改对象并破坏接口契约。我建议您重新考虑接口或更改运算符的实现 - 您可能希望将指向对象的内容复制到内部列表中,而不仅仅是使用指针进行操作。

于 2013-05-23T07:01:05.563 回答
2

如果您真的想将 const 指针转换为非常量指针,您可以const_cast按照 Gaurav 的建议使用。

但是,当我真的被别人的 lib/api 逼到绝路时,我才会使用类似的东西作为最后的手段,我只需要使用它。

如果这发生在您自己的代码中,这通常意味着您没有仔细设计您的 api/接口和/或误用/误解“const 正确性”

我强烈建议您阅读有关const 正确性的内容。

更新: const corectness 不仅仅是我们在 C++ 中拥有的另一个花哨的东西。有时它可能会增加一些痛苦,但它也为代码的客户端以及编译器/优化器提供了一些假设空间。从字面上做const_cast“违反规则”,很容易导致意想不到的行为。

于 2013-05-23T06:43:03.303 回答
1

您可以使用next = const_cast<blog *>(b)

const_cast 将删除或抛弃变量的恒定性。

于 2013-05-23T06:34:00.550 回答
0

如果你真的想重载 operator+ ,它与你的类的通常含义和用法不同,所以你真的不需要将你的参数声明为 const。这样你就可以解决你的问题

于 2013-05-23T06:17:47.073 回答
0

您的笔记可能指的是二元运算符重载的常见情况,其中两个操作数不会改变(它们仅用于创建结果)

例如,如果您重载 + 或 - 进行算术运算。

您的参数是指向不允许更改的对象的指针,现在由于您有一个链接列表,其中节点数据存储在类中,这不是您想要的,因为简单地更改列表会更改对象。

使用强制转换来纠正您的错误只会破坏使您成为参数 const 的目的,您最好不要将其设为 const,这对于您正在做的事情可能很好。

运算符重载只是函数,没有硬性理由它们应该比任何其他函数都 const,我可以看到。

于 2013-05-23T06:54:36.240 回答