链表的严格性

时间:2013-09-06 17:40:08

标签: c++ pointers const

我正在编写一个类,其中多个实例像链接列表一样链接在一起。以下是相关代码的准系统示例:

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被声明为constgetNext出现问题。无论什么对象从当前节点获得下一个节点都可能需要修改节点,但由于成员变量为const,因此返回的引用也必须为const

根据我的阅读,const_cast通常表示设计不佳,但似乎我必须在获取下一个节点的对象内部使用它,或者在A类中使用它来返回非 - 参考。这是const_cast的有效用法还是我的设计中存在缺陷?

虽然我们正在研究这个问题,但对于是否返回引用或指针,是否存在某种方式的偏好?我setNext接受引用以确保我获得A的有效实例,但返回的值可以以任何方式返回。

2 个答案:

答案 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;
}
相关问题