将const参数作为参数传递时出现隐式错误消息

usu*_* me 3 c++ pointers const parameter-passing

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

DNode::DNode(const int a_key, const DNode* a_prev, const DNode* a_next) 
    : key(a_key), prev(a_prev), next(a_next) {}
Run Code Online (Sandbox Code Playgroud)

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

编译输出以下错误:

dnode.cpp:6:89:错误:无法使用类型为const DNode *'的左值初始化类型为'DNode *'的成员子对象DNode :: DNode(const int a_key,const DNode * a_prev,const DNode * a_next) :键(a_key),上一个(a_prev),下一个(a_next){}

dnode.cpp:6:103:错误:无法使用类型为const DNode *'的左值初始化类型为'DNode *'的成员子对象DNode :: DNode(const int a_key,const DNode * a_prev,const DNode * a_next) :键(a_key),上一个(a_prev),下一个(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;

};
Run Code Online (Sandbox Code Playgroud)

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; }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息

dnode.cpp:6:89:错误:无法使用类型为'const DNode *'的右值初始化'DNode *'类型的成员子对象DNode :: DNode(const int a_key,const DNode&a_prev,const DNode&a_next):key (a_key),上一个(&a_prev),下一个(&a_next){}

dnode.cpp:6:104:错误:无法使用类型为'const DNode *'的右值初始化'DNode *'类型的成员子对象DNode :: DNode(const int a_key,const DNode&a_prev,const DNode&a_next):key (a_key),上一个(&a_prev),下一个(&a_next){}

dnode.cpp:15:52:错误:从不兼容类型'const DNode *'分配给'DNode *'void DNode :: set_prev(const DNode&a_prev){prev =&a_prev; }

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

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

Mr.*_*C64 5

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

DNode* prev;
DNode* next;
Run Code Online (Sandbox Code Playgroud)

在构造函数中,您具有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) {}
Run Code Online (Sandbox Code Playgroud)

const DNode*参数意味着你有一个指向DNode常量,即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) {}
Run Code Online (Sandbox Code Playgroud)

如果要使用这种“ 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) {}
Run Code Online (Sandbox Code Playgroud)

这意味着a_prev并且a_next不能被重新分配以指向其他数据;但是它们确实指向可以修改的内容(a DNode*)。