Реализация узла дерева B +

Я реализую дерево 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 ++.

2

Решение

Вы действительно должны использовать виртуальный метод для чего-то вроде этого. Вы можете изменить свой 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,

3

Другие решения

Сообщение об ошибке

error: request for member ‘data’ in ‘left<int>’, which is of non-class type  ‘BTree<int>::LeafNode*()’

и другие ошибки этой формы обычно означают, что вы пытаетесь получить доступ к полю struct используя . когда вы должны использовать ->, Например, если у вас есть

LeafNode* ptr = /* ... */;
ptr.data[0] = /* ... */;

Вы получите ошибку во второй строке, потому что вы используете . вместо ->,

Попробуйте выяснить, является ли это ошибкой, которую вы испытываете на указательной линии, и, если это так, замените точку на стрелку.

Надеюсь это поможет!

0