我有以下类似四叉树的结构,其中每个单元格可以是内部节点或叶子。如果是叶子,它可以存储颜色。如果它是一个内部节点,它存储指向四个子节点(可以是叶节点或内部节点)的指针:
class RenderBucketCell{
public:
RenderBucketCell();
RenderBucketCell(float R, float G, float B, float A, unsigned short X, unsigned short Y);
~RenderBucketCell();
void split();
void collapse();
bool isLeaf;
RenderBucketCell* neighbours[8];
unsigned short x;
unsigned short y;
union{
struct{
float r;
float g;
float b;
float a;
};
struct{
RenderBucketCell* children[4];
};
};
};
如果单元格是内部节点,则不需要存储颜色。如果它是一片叶子,那么它就不需要存储指向孩子的指针。因此颜色和孩子们应该共享相同的记忆(联合)
有一个函数 split() 将叶子转换为内部节点,并为当前单元格当前具有相同颜色的子节点(叶子)创建:
void RenderBucketCell::split(){
isLeaf=false;
float rt = r;//make backups of the values before setting the children (union)
float gt = g;
float bt = b;
float at = a;
unsigned short xt2 = x*2;
unsigned short yt2 = y*2;
children[0] = new RenderBucketCell(rt,gt,bt,at, xt2, yt2);
children[1] = new RenderBucketCell(rt,gt,bt,at, xt2+1, yt2);
children[2] = new RenderBucketCell(rt,gt,bt,at, xt2, yt2+1);
children[3] = new RenderBucketCell(rt,gt,bt,at, xt2+1, yt2+1);
}
现在我正在调试函数 split()。我在线上设置了一个调试点
children[0] = new RenderBucketCell(rt,gt,bt,at, xt2, yt2);
所以现在:调试器停在这一行,我观察成员值。我做了一个过程步骤,以便执行该行(指令光标现在位于下一行)。执行完这行代码之后,children[0] 的指针值还是一样的!相反,children[2] 的指针值发生了变化(连同浮点值 b)
有人可以向我解释这种行为吗?我究竟做错了什么?
谢谢!