我正在编写一个类,其中多个实例像链接列表一样链接在一起。以下是相关代码的准系统示例:
class A
{
public:
void setNext(const A& node) { next = &node; }
const A& getNext() const { return *next; }
private:
const A* next;
}
我已将setNext
的参数声明为const
,因为node
未修改setNext
。 A类也不会修改下一个节点,因此成员变量next
被声明为const
。 getNext
出现问题。无论什么对象从当前节点获得下一个节点都可能需要修改节点,但由于成员变量为const
,因此返回的引用也必须为const
。
根据我的阅读,const_cast
通常表示设计不佳,但似乎我必须在获取下一个节点的对象内部使用它,或者在A类中使用它来返回非 - 参考。这是const_cast
的有效用法还是我的设计中存在缺陷?
虽然我们正在研究这个问题,但对于是否返回引用或指针,是否存在某种方式的偏好?我setNext
接受引用以确保我获得A的有效实例,但返回的值可以以任何方式返回。
答案 0 :(得分:0)
首先,不要重新发明轮子。如果可能的话,使用boost::intrusive
已经为您实现了这样的侵入式列表,无需额外的工作!您甚至可以使用std::list
或其他标准容器。
但如果您 :
const
,因为您可能需要修改它指向的next
节点。setNext
需要通过非const引用获取其参数,因为您需要能够存储非const项指针。getNext
的两个重载:const A& getNext() const { return *next; }
和A& getNext() { return *next; }
答案 1 :(得分:0)
我认为链表私有成员必须是非const的,因为你可能想要实现一个方法,例如,可以遍历列表,调用每个成员上的特定函数。因此,关于const下一个成员的设计可能有很多限制。其他的事情,你必须小心接收setNext上的参考:你怎么知道列表的结尾?使用指针,您可以将下一个设置为NULL,它将成为列表的结尾。但是你可以保持你的成员非const并实现一个返回const对象的getNext,在这种情况下你将拥有:
class A
{
public:
void setNext(A* node) { next = node; }
A& getNext() const { return *next; }
const A& getNext() const { return *next; }
private:
A* next;
}