所以我正在写一个双向链表的实现。这是实现单个节点的类的构造函数:

DNode::DNode(const int a_key, const DNode* a_prev, const DNode* a_next)
    : key(a_key), prev(a_prev), next(a_next) {}

我写const int a_key, const DNode* a_prev, const DNode* a_next的原因是因为构造函数没有理由修改它们。因此,我只想保护自己不要在构造函数内进行任何不必要的修改。这是一件好事吗?

编译输出以下错误:



我不明白该错误信息。 DNode*是指针类型,而不是左值。欢迎任何帮助。

===编辑===

我将代码修改为以下内容。

dnode.h
class DNode {

 public:

  //
  DNode( const int a_key, const DNode& a_prev, const DNode& a_next );

  //
  int get_key() const;
  DNode* get_prev() const;
  DNode* get_next() const;

  //
  void set_key( const int a_key );
  void set_prev( const DNode& a_prev );
  void set_next( const DNode& a_next );

  //
 private:

  int key;
  DNode* prev;
  DNode* next;

};

dnode.cpp
//
DNode::DNode( const int a_key, const DNode& a_prev, const DNode& a_next )
: key(a_key), prev(&a_prev), next(&a_next) {}

//
int DNode::get_key() const { return key; }
DNode* DNode::get_prev() const { return prev; }
DNode* DNode::get_next() const { return next; }

//
void DNode::set_key( const int a_key ) { key = a_key; }
void DNode::set_prev( const DNode& a_prev ) { prev = &a_prev; }
void DNode::set_next( const DNode& a_next ) { next = &a_next; }

我收到以下错误消息



dnode.cpp:16:52:错误:从不兼容的类型分配给'DNode *'
'const DNode *'void DNode::set_next(const DNode&a_next){next =
&a_next; }

再一次,我在构造函数的参数列表中写入const DNode& a_prev的原因是因为我想防止a_prev被构造函数修改(但我不在乎是否在外部对其进行了修改)。但是由于它不起作用,所以我可能在这种情况下误解了const的用法。

最佳答案

我认为在您的类(class)中,您有数据成员(您尚未显示),其定义如下:

DNode* prev;
DNode* next;

在构造函数中,您具有const DNode*参数(a_preva_next):
DNode::DNode(const int a_key, const DNode* a_prev, const DNode* a_next)
   : key(a_key), prev(a_prev), next(a_next) {}
const DNode*参数表示您有一个指向DNode的指针,该指针是 const ,即指向的DNode不能修改。
但是您想将其分配给不是DNode*const数据成员(即,可以修改DNode指向的数据成员)。
您不能将约束为const(即无法修改)的内容分配给非const(即可以修改)的内容。

下面的代码应该工作:
// Remove 'const' from the pointers!
DNode::DNode(const int a_key, DNode* a_prev, DNode* a_next)
  : key(a_key), prev(a_prev), next(a_next) {}

如果要使用这种“输入参数上的const”样式(例如const int a_key),则应将const放在指针符号(*)和参数名称之间,例如
// Proper placing of 'const'
DNode::DNode(const int a_key, DNode* const a_prev, DNode* const a_next)
  : key(a_key), prev(a_prev), next(a_next) {}

这意味着a_preva_next不能重新分配为指向其他数据。但它们确实指向可以修改的内容(DNode*)。

09-15 17:55