3

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

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: 错误: 无法使用“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;

};

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: 错误: 无法使用 'const DNode *' 类型的右值初始化'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: 错误: 无法使用 'const DNode *' 类型的右值初始化'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: 错误:从不兼容的类型'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在这种情况下的用法。

4

3 回答 3

5

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

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*constDNode
constconst

以下代码应该可以工作:

// 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_prevanda_next不能被重新分配以指向其他数据;但它们确实指向可以修改的东西(a DNode*)。

于 2013-10-17T10:31:44.173 回答
3

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

于 2013-10-17T10:05:39.230 回答
1

看起来像DNode成员a_prev并且a_next是指向非常量对象的指针。几个选项:

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

(*看起来您正在尝试编写一个双向链表,在这种情况下您不想保留其他节点的副本,并且前一个节点和下一个节点能够为空会很方便,离开选项 1 或 4。)

于 2013-10-17T10:17:54.770 回答