传递const参数作为参数时的隐秘错误消息

时间:2013-10-17 10:03:28

标签: 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) {}

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

编译输出以下错误:

  

dnode.cpp:6:89:错误:无法初始化类型的成员子对象   'DNode *',其左值为'const DNode *'DNode :: DNode(const   int a_key,const DNode * a_prev,const DNode * a_next):key(a_key),   prev(a_prev),next(a_next){}

     

dnode.cpp:6:103:错误:无法初始化成员   “DNode *”类型的子对象,其左值为“const DNode *”   DNode :: DNode(const int a_key,const DNode * a_prev,const DNode *   a_next):key(a_key),prev(a_prev),next(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:6:89:错误:无法初始化类型的成员子对象   'DNode *',其右值为'const DNode *'DNode :: DNode(const   int a_key,const DNode& a_prev,const DNode& a_next):key(a_key),   prev(& a_prev),next(& a_next){}

     

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

     
    

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

  
     

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在这种情况下的用法。

3 个答案:

答案 0 :(得分:4)

我认为在课堂上你有数据成员(你没有展示过),定义如下:

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*参数表示您有一个指向 const DNode的指针,即指向的DNode无法修改。
但是您想将其分配给非DNode*的{​​{1}}数据成员(即{em> } 您不能将约束为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_prev)。

答案 1 :(得分:3)

您正尝试使用指向const对象的指针初始化指向非const对象的指针。 也许你想将const指针传递给非const对象?那么它将是DNode* const a_prev

答案 2 :(得分:1)

看起来DNode成员a_preva_next是指向非const对象的指针。 一些选择:

  • 使这些成员成为const对象的指针
  • 将成员放在堆栈上,并在初始化列表中传入解除引用的参数,以便调用复制构造函数。*
  • Heap在构造函数中分配成员,并将解除引用的参数传递给复制构造函数调用。*
  • 对这些指针采用非const参数。

(*看起来你正在尝试编写一个双向链表,在这种情况下你不想保存其他节点的副本,这对于前一个节点和下一个节点来说都很方便null,留下选项1或4。)