2016-08-01 21 views
-7

申し訳ありません、私は今質問を編集しました。大胆なタイプの単語に注意を払う。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; 
    } 
    } 
}; 
+5

私はかなり無意味に見えますが、実際には何をしたいですか? –

+0

達成しようとしていることは何ですか?あなたはaとbをすぐにゼロに設定できます:-) –

+1

私は本当にあなたがこのような奇妙なことを必要とするとは思わない。それはXYの問題でなければなりません。 –

答えて

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のデータに基づいて)再帰的にこれをやっているという事実は、一種の異なるものです。この場合、クラスはツリーに深く束縛されており、ツリーを構築することなく簡単に構築することはできません。はい、(コメントから)可能ですが、実際にはお勧めできません。

あなたが(例えばツリー)を格納する項目のグループを持っている場合は、典型的なビルディングブロックは

  1. Itemです - あなたは、ツリーに格納もの(オブジェクト)。
  2. Node - ツリーを理解するオブジェクト、およびツリーをどのようにトラバースするか。
  3. TreeContainer - ツリーの最上部を保持し、保存された見つける方法を知っているオブジェクトItem
  4. Builder - あなたのデータを取り、TreeContainer
  5. の呼び出し方法によって、木にそれを追加するオブジェクトまたは関数
+2

"コンストラクタを使用して一連の物を構築することはできません。私はこの主張は簡単に再現可能だと思う;-)。 –

+1

もっと深刻な面では、私はctorが構築している多くの実際のものを構築することも不可能ではない理由は理解できません。同様に、ノードctorはツリー全体を作成し、そのノードを数回呼び出し、作成したノードのアドレスを適切な分岐ポインタに割り当てます。それはおそらくOPが達成しようとしているものです。 –

+1

また、必要ならば、これらの役割をすべて1つのノードクラスにまとめることもできます。あなたが作った区別は、言葉ではなく論理的です。 –

関連する問題