죄송합니다. 지금 제 질문을 수정했습니다. 대담한 유형의 단어에주의를 기울이시기 바랍니다.C++ 재귀 생성자를 정의하는 표준 방법은 무엇입니까?
정말 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;
}
}
};
내게 꽤 무의미 해 보입니다. 실제로 달성하기를 원하십니까? –
달성하려는 목표는 무엇입니까? 바로 a와 b를 0으로 설정할 수 있습니다 :-) –
정말 이상한 일이 절실히 필요하다는 것을 정말로 믿지 않습니다. 그것은 XY 문제가되어야합니다. –