抱歉,我现在编辑了我的问题。请注意粗体字。
在定义kdtree类时我真的需要一个递归构造函数。 但是,我担心我没有以正确的方式做到这一点。 我怎样才能更优雅地做到这一点?
这是我使用此指针的代码,它编译并且运行良好。 根本不做任何事情,只是显示递归构造函数应该是什么样子的简要概念。
#include <iostream>
using namespace std;
class foo
{
public:
int a, b;
foo(unsigned int k)//this piece of code just shows the brief idea of what i'm trying to do.
{
if (k)
*this = foo(--k);
else
a = k, b = k;
}
};
int main()
{
foo f(3);
cout << f.a << f.b << endl;
getchar();
}
这是我的kdtree示例代码。这是我实际尝试实现的目标,仍然不编译,我会稍后再编辑。
class kdtree
{
public:
int16_t count;//数组里面可以只存mask和key生成的unique_key,因为树结构,和count可以后期生成
int16_t key;
int16_t mask;
inline bool is_full()
{
return mask + count == 0x8000;
};
shared_ptr<kdtree> left, right;
kdtree(){}
kdtree(int x1, int y1, int z1, int x2, int y2, int z2, int _x = 0, int _y = 0, int _z = 0, int len = 0, int ikey = 0x8000)
{
int i = 0x80 >> len / 3, j = 0x4000 >> len;
if ((x2 - x1)*(y2 - y1)*(z2 - z1) == j << 10)
{
count = j << 1;
key = ikey;
mask = ~ikey ^ (ikey - 1);
return;
}
switch (len++ % 3)
{
case 0:
if (x1 < _x&&x2 < _x)
{
*this = kdtree(x1, y1, z1, x2, y2, z2, _x, _y, _z, len, ikey -= j);
return;
}
if (x1 >= _x&&x2 >= _x)
{
*this = kdtree(x1, y1, z1, x2, y2, z2, _x + i, _y, _z, len, ikey += j);
return;
}
left = shared_ptr<kdtree>(new kdtree(x1, y1, z1, _x, y2, z2, _x, _y, _z, len, ikey -= j));
right = shared_ptr<kdtree>(new kdtree(_x, y1, z1, x2, y2, z2, _x + i, _y, _z, len, key += j));
count = j << 1;
key = ikey;
mask = ~ikey ^ (ikey - 1);
return;
case 1:
if (y1 < _y&&y2 < _y)
{
*this = kdtree(x1, y1, z1, x2, y2, z2, _x, _y, _z, len, ikey -= j);
return;
}
if (y1 >= _y&&y2 >= _y)
{
*this = kdtree(x1, y1, z1, x2, y2, z2, _x, _y + i, _z, len, ikey += j);
return;
}
left = shared_ptr<kdtree>(new kdtree(x1, y1, z1, x2, y2, z2, _x, _y, _z, len, ikey -= j));
right = shared_ptr<kdtree>(new kdtree(x1, y1, z1, x2, y2, z2, _x, _y + i, _z, len, ikey += j));
count = j << 1;
key = ikey;
mask = ~ikey ^ (ikey - 1);
return;
case 2:
if (x1 < _x&&x2 < _x)
{
*this = kdtree(x1, y1, z1, x2, y2, z2, _x, _y, _z, len, ikey);
return;
}
if (x1 >= _x&&x2 >= _x)
{
*this = kdtree(x1, y1, z1, x2, y2, z2, _x, _y, _z + i, len, ikey + j);
}
left = shared_ptr<kdtree>(new kdtree(x1, y1, z1, x2, y2, _z, _x, _y, _z, len, ikey));
right = shared_ptr<kdtree>(new kdtree(x1, y1, _z, x2, y2, z2, _x, _y, _z + i, len, ikey + j));
count = j << 1;
key = ikey;
mask = ~ikey ^ (ikey - 1);
return;
}
}
};
答案 0 :(得分:0)
构造函数只构建一个东西,因此你不能使用构造函数来构建一组东西。
如果你使用新类[20]; // 20类被分配,但每个类在构造函数中构造一次。
class Class
{
Class * left;
Class * right;
Class( SomeObject & x )
{
eatSomeData( x );
left = nullptr;
right = nullptr;
if (x->buildleft() )
left = new Class( x );
if (x->buildright() )
right = new Class( x );
}
};
在每次调用构造函数时,构造函数只处理它正在创建的对象,它以递归方式执行此操作(基于x中的数据),有点不同。在这种情况下,类严重绑定到树中,并且在不构建树的情况下无法轻松构建。是的,可以(来自评论),但真的不可取。
如果您要存储一组项目(例如树),则典型构建块为
Item
- 您存储在树中的事物(对象)。Node
- 一个理解树的对象,以及如何遍历树。TreeContainer
- 一个保存树顶部的对象,它知道如何查找存储的Item
Builder
- 一个对象或函数,它通过调用TreeContainer