0

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

class A
{
  public:
    void setNext(const A& node) { next = &node; }
    const A& getNext() const { return *next; }

  private:
    const A* next;
}

我已将参数声明为setNextasconst因为node没有被setNext. A 类也不修改下一个节点,所以next声明了成员变量const。问题发生在getNext. 无论对象从当前节点获取下一个节点,可能都需要修改该节点,但既然成员变量是const返回的引用,也必须如此const

从我读过const_cast的内容来看,通常表明设计不佳,但似乎我必须在获取下一个节点的对象内部使用它,或者在 A 类中使用它来返回非常量引用。这是const_cast对我的设计的有效使用还是在某处存在缺陷?

当我们讨论这个主题时,对于返回引用还是指针,是否存在一种偏好?我有setNext一个参考来确保我得到一个有效的 A 实例,但是返回的值可以以任何一种方式返回。

4

2 回答 2

0

首先,不要重新发明轮子。如果可能使用boost::intrusive已经为您实现了这样的侵入性列表,则无需额外的工作!您甚至可以摆脱std::list或使用其他标准容器。

但如果你必须

  • 指向下一个变量的指针不能是const因为您可能需要修改next它指向的节点。
  • setNext将需要通过非常量引用获取其参数,因为您需要能够存储非常量项指针。
  • 创建两个重载getNextconst A& getNext() const { return *next; }A& getNext() { return *next; }
于 2013-09-06T17:49:10.020 回答
0

我认为链表私有成员必须是非常量的,例如,因为您可能希望实现一种可以遍历列表并在每个成员上调用特定函数的方法。因此,您关于 const next 成员的设计可能有很多限制。另一件事,你必须注意在你的 setNext 上接收参考:你怎么知道你的列表的结尾?使用指针,您可以将 next 设置为 NULL,它将成为列表的末尾。但是你可以让你的成员保持非 const 并实现一个 getNext 来返回一个 const 对象,在这种情况下你将拥有:

class A
{
  public:
    void setNext(A* node) { next = node; }
    A& getNext() const { return *next; }
    const A& getNext() const { return *next; }

  private:
    A* next;
}
于 2013-09-06T17:52:59.570 回答