Я реализую дерево B + для класса. Узлы в настоящее время реализованы так:
class Node {
public:
E* keys[order*2];
Node *children[order*2+1];
int size;
Node(){
size = 0;
}
bool empty() {
return size == 0;
}
bool isLeafNode() {
return false;
}
};
class LeafNode : public Node {
public:
E* data[order*2+1];
bool isLeafNode() {
return true;
}
};
Когда я хочу добавить элемент в листовой узел (путем доступа к LeafNode-> data), я получаю
error: request for member ‘data’ in ‘left<int>’, which is of non-class type ‘BTree<int>::LeafNode*()’
Я предполагаю, что это происходит потому, что компилятор не знает, является ли узел, к которому я обращаюсь, внутренним или конечным узлом, хотя сначала я проверяю его с помощью isLeafNode ().
Я не могу объединить два класса в один, потому что листовым узлам нужно на один Bucket для данных больше, чем внутренним узлам.
Я понимаю, что это своего рода вопрос дизайна, но есть ли какой-то тривиальный подход к этой проблеме, который я упускаю? Я довольно новичок в C ++.
Вы действительно должны использовать виртуальный метод для чего-то вроде этого. Вы можете изменить свой isLeafNode()
запрос на возврат указателя на конечный узел, если он один, и NULL в противном случае.
class LeafNode; // forward declare
class Node {
//...
public:
virtual ~Node () {}
virtual LeafNode * isLeafNode () { return 0; }
//...
};
class LeafNode : public Node {
//...
public:
LeafNode * isLeafNode () { return this; }
//...
};
Затем вы можете использовать этот метод из Node
чтобы получить доступ к data
если это на самом деле LeafNode
,
Сообщение об ошибке
error: request for member ‘data’ in ‘left<int>’, which is of non-class type ‘BTree<int>::LeafNode*()’
и другие ошибки этой формы обычно означают, что вы пытаетесь получить доступ к полю struct
используя .
когда вы должны использовать ->
, Например, если у вас есть
LeafNode* ptr = /* ... */;
ptr.data[0] = /* ... */;
Вы получите ошибку во второй строке, потому что вы используете .
вместо ->
,
Попробуйте выяснить, является ли это ошибкой, которую вы испытываете на указательной линии, и, если это так, замените точку на стрелку.
Надеюсь это поможет!