如果链接列表实现具有类Link
:
class Link {
public:
string value;
// constructor etc.
Link* insert(Link* n);
// other member functions
Link* advance(int n) const;
private:
// ...
}
在const成员函数Link* advance(int n) const
中,我希望通过列表中的n
元素前进并获得指向该元素的指针。为此,我想用this
指针初始化一个指针:
Link* Link::advance(int n) const {
if (this==0) return 0;
Link* p = this;
// do stuff with p
return p;
}
这不起作用,因为Link* p = this;
正在尝试使用Link*
初始化const Link*
。但是,如果我将其更改为const Link* p = this;
,则return p;
会返回错误的类型。
我认为函数应该是const
,因为它不会改变任何东西,但我也希望它返回一个非const指针,因为我想用它来修改列表中的元素。是否有比丑陋更好的方式,比如
Link* Link::advance(int n) const {
if (this==0) return 0;
const Link* p = this;
// do stuff with p
return const_cast<Link*>(p);
}
实现这个目标?
答案 0 :(得分:2)
如果你想修改链表中的元素,那么该函数首先不应该是const
,因为const
函数是基于你没有修改数据的事实。您传入的对象(如果该链接列表,它也适用于列表的任何后续成员)。您也不应泄漏允许修改类的对象,例如返回对象内元素的指针或引用。
如果你真的想修改这个函数中列表的内容,那么使函数非常量。如果您希望出于实际原因const
的函数(传递const
值),那么请使用const
的第二个变体并且不会修改内容(并返回const Link*
)。