2016-08-01 54 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設置爲0 :-) –

+1

我真的不相信你會需要這樣一個奇怪的東西。這應該是一個XY問題。 –

回答

0

構造函數只構建一件事物,所以你不能使用構造函數來構建一組事物。

如果您使用新的Class [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

我也認爲你可以將所有這些角色摺疊成一個節點類,如果你必須的話;你所做的區別是邏輯的而不是語言強加的。 –

相關問題