我正在为一个班级实施一个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->数据),我得到了
error: request for member ‘data’ in ‘left<int>’, which is of non-class type ‘BTree<int>::LeafNode*()’
我想这是因为编译器不知道我正在访问的节点是内部节点还是叶子节点,尽管我首先使用isLeafNode()来检查它。 我无法将这两个类合并为一个,因为叶子节点需要比内部节点多一个Bucket用于数据。
我意识到这是一个设计问题,但是对于这个我缺少的问题有一些微不足道的方法吗?我对C ++很新。
答案 0 :(得分:4)
你真的应该使用虚拟方法来做这样的事情。您可以更改isLeafNode()
查询以返回指向叶节点的指针(如果为1),否则返回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
。
答案 1 :(得分:0)
错误消息
error: request for member ‘data’ in ‘left<int>’, which is of non-class type ‘BTree<int>::LeafNode*()’
此表单中的其他错误通常表示您在使用struct
时尝试使用.
访问->
字段。例如,如果你有
LeafNode* ptr = /* ... */;
ptr.data[0] = /* ... */;
您将在第二行收到错误,因为您使用的是.
而不是->
。
尝试查看这是否是您在指示线上出现的错误,如果是,请将点更改为箭头。
希望这有帮助!