所以我正在写一个双向链表的实现。这是实现单个节点的类的构造函数:
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_prev
和a_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_prev
和a_next
不能重新分配为指向其他数据。但它们确实指向可以修改的内容(DNode*
)。