В моей реализации у меня есть основной класс Tree
, который содержит много Node
. Каждый Node
содержит указатель на следующий Node
, который может быть NULL, если не реализован. Tree
отслеживает общее количество узлов.
Через Tree
реализована функция поиска, которая возвращает указатель Node
. Однако, если Node
еще не существует, создается новый узел. Это увеличивает переменную Tree::m_totalnodes
. Однако Tree::GetNode
является константой, однако эта модификация не выдает никаких предупреждений, ошибок или сбоев во время выполнения. В чем причина этого (может быть, связано с тем, что tbNode::m_tree
не является константой)?
class Node; //forward declare
class Tree {
public:
Tree() : m_totalnodes(0) {
m_firstnode = new Node(this,0);
}
Node* GetNode(int nodenumber) const { //note const! Should not modify Tree
return m_firstnode->FindNode(nodenumber); //this function eventually modifies it (and no warning)
}
private:
friend class Node;
unsigned int m_totalnodes;
Node* m_firstnode;
};
class Node {
public:
Node(Tree *thetree, int nodenumber) : m_tree(thetree), m_nextnode(NULL), m_nodenumber(nodenumber) {
m_tree->m_totalnodes++;
}
Node* FindNode(int nodenumber) {
if (!m_nextnode)
m_nextnode = new Node(m_tree, nodenumber);
return m_nextnode;
}
private:
Tree* m_tree;
Node* m_nextnode;
unsigned int m_nodenumber;
};
m_firstnode
, аTree::m_totalnodes
изменяется (в конечном итоге) черезTree::GetNode()
. 26.05.2014FindNode
не является константным, и его вызывают черезm_firstnode
. Если вы хотите, чтобы это работало без измененияm_totalnodes
, вам нужно добавить const-qualifiedFindNode
, а затем вызвать его через соответствующую ссылку. 26.05.2014