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转换成下一个指针?谢谢!
答案 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,我可以看到。