类成员函数在至少两个类实例之前声明时失败

时间:2011-05-22 04:38:54

标签: c++ inheritance

我有两个类,BTLeafNode和BTNonLeafNode,每个类都来自我的BTreeNode类。 BTreeNode有一个受保护的数据成员缓冲区,它是一个1024字节的字符数组。 BTreeNode有一个模板函数inserttemp,它在缓冲区中存储int-T对,其中T是调用函数的类型。每个类都有自己的函数insert,调用inserttemp。 BTNonLeafNode存储int-PageId对(PageId基本上是一个int),BTLeafNode将int-RecordId对(Record Id由PageId和int组成)存储到缓冲区中。我还没有测试BTNonLeafNode,但出于某种原因,当我只有两个BTLeafNode实例并且我调用insert函数时它工作正常,但是对于BTLeafNode的任何实例,它是在声明了至少两个BTLeafNode实例之后声明的,它搞砸了。应该在RecordId中存储int的内存部分存储下一个int-RecordId对的int(这两个数据在缓冲区中彼此相邻存储)。

我真的很困惑,因为我不明白为什么声明一个实例会搞乱这个功能。没有任何全局变量。你甚至不需要对声明的实例做任何事情,只要你声明它们就会混淆函数。

1 个答案:

答案 0 :(得分:0)

此时没有发布代码,因此我们无法准确地看到发生了什么,但是如果您尚未将任何数据成员声明为静态数据成员,并且每个派生的实例都是{{1}拥有它自己的私有缓冲区,那么我几乎可以保证问题与继承无关,或者你声明了派生对象的实例数,但很可能是插入算法的问题。它可能是一个微妙的错误,在每种情况下都不会出现,因此一些插入工作的原因,但同样,因为每个实例对象都有自己的内存缓冲区,那么实例对象可以让它的内存缓冲区被搞砸的唯一方法up是访问实例对象的数组的成员函数中的算法是否有问题。

另外你说在BTreeNode的每个实例中都有一个1024字节的字符数组,但你是使用模板函数存储对...你是否正在进行某种类型的转换BTreeNode并使用unsigned char*在缓冲区中分配对结构?如果你是,那么如果你不小心你如何增加和投射你的指针,那么会有很多可能出错。