Итак, я пишу реализацию двусвязных списков. Это конструктор класса, реализующий отдельные узлы:
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 *» с lvalue типа «const 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: ошибка: невозможно инициализировать подобъект-член типа «DNode *» с lvalue типа «const DNode *» DNode::DNode(const int a_key, const DNode* a_prev, const DNode* a_next) : ключ(a_key), предыдущий(a_prev), следующий(a_next) {}
Я не понимаю сообщение об ошибке. DNode*
- это тип указателя, а не lvalue. Любая помощь приветствуется.
=== ИЗМЕНИТЬ ===
Я изменил свой код следующим образом.
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 *» с rvalue типа «const DNode *» DNode::DNode(const int a_key, const DNode& a_prev, const DNode& a_next): ключ (a_key), предыдущая(&a_prev), следующая(&a_next) {}
dnode.cpp:6:104: ошибка: невозможно инициализировать подобъект-член типа «DNode *» с rvalue типа «const DNode *» DNode::DNode(const int a_key, const DNode& a_prev, const DNode& a_next): ключ (a_key), предыдущая(&a_prev), следующая(&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
в этом контексте.