转换无效?为指针指定const指针

时间:2013-05-23 06:11:36

标签: c++

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转换成下一个指针?谢谢!

5 个答案:

答案 0 :(得分:8)

从您的问题和评论中我了解到您对const blog *的含义感到困惑。

你必须向后读指针类型

  • blog *是指向博客的指针 - 您可以更改指针值,您可以使用指针更改指向对象。
  • blog const *(和const blog *)是指向const博客的指针 - 您可以更改指针值,但不能使用此指针更改对象。
  • blog * const指向博客的const指针 - 您无法更改指针值,但您仍然可以使用此指针更改指向对象。

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

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

答案 1 :(得分:1)

如果你真的想将const指针强制转换为非const指针,你可以使用const_cast作为Gaurav的建议。

然而,当我真正被其他人的lib / api逼迫时,我会使用类似的东西作为最后的手段。

如果在您自己的代码中发生这种情况,这通常意味着您没有仔细设计您的api /界面和/或误用/误解“const correctness”

我强烈建议您阅读const correctness

UPDATE: const corectness不仅仅是我们在C ++中的另一个奇特之处。它有时可能会增加一些痛苦,但它也为代码的客户端以及编译器/优化器提供了一些假设空间。按照const_cast字面意思“打破规则”,可能很容易导致意外行为。

答案 2 :(得分:0)

如果你真的想要重载operator +,不同于你的类的通常含义和用法,那么你真的不需要将你的参数声明为const。通过这种方式,您可以解决您的问题

答案 3 :(得分:0)

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

const_cast将删除或抛弃变量的常量。

答案 4 :(得分:0)

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

例如,如果你正在重载+或 - 来进行算术运算。

你的参数是指向一个不允许更改的对象的指针,现在因为你有一个链接列表,其中节点数据存储在类中,这不是你想要的,只需更改列表就可以改变对象

使用强制转换来纠正你的错误只会破坏你制作参数const的目的,你最好不要把它变成const,这对你正在做的事情来说可能很好。

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