2017-10-16 159 views
-3

我需要從同一類的非靜態成員函數,如調用非靜態成員函數:如何從靜態成員函數中調用非靜態成員函數?

class bintree { 
private: 
    float root; 
    bintree *left; 
    bintree *right; 


public: 
    bintree() : left(nullptr), right(nullptr) { 
    } 

    bintree(const float &t) : root(t), left(nullptr), right(nullptr) { 
    } 

    ~bintree() { 
    if (left != nullptr) 
     delete left; 

    if (right != nullptr) 
     delete right; 
    } 

    static void niveles(bintree *); 

    static bintree *dameBST(float** array, int depth, int left = 0, int right = -1); 
    void quickSort2D(float** arr, int left, int right, int n); 

}; 

我的問題是在dameBST功能時,我稱之爲quickSort2D程序美眉用「分段故障: 11'消息。

bintree * 
bintree::dameBST(float **array, int depth, int left, int right) 
{ 
    int n=0; 
    depth++; 
    bintree *t = new bintree; 
    bintree *tl; 
    bintree *tr; 

    if(depth%2 != 0) { n = 1; } 

    quickSort2D(array, left, right -1, n); 
    if (right == -1) {right = 10;} 
    if (left == right) { return nullptr; } 
    if(left == right - 1) { return new bintree(array[left][n]); } 



    int med = (left + right)/2; 

    t->root = array[med][n]; 
    tl = dameBST(array, depth, left, med); 
    tr = dameBST(array, depth, med + 1, right); 
    t->left = tl; 
    t->right = tr; 




return t; 

我不明白爲什麼。

+1

不要: ),如果你需要這樣做,那意味着靜態函數首先需要成爲一個成員函數。 – alfC

+0

嗯,我猜傳統的答案是將實例作爲參數傳遞,然後從靜態函數內部調用實例方法。 –

回答

1

非靜態成員函數是必須在類的實例上調用的方法。在靜態上下文中沒有實例。只有班。

如果你有類的對象tbinkree可以調用方法quickSort2D

t.quickSort2D(...) 

UPDATE 您還可以從非靜態函數靜態方法而不是相反

+0

其實它是t-> quickSort2D()因爲成員引用類型'bintree *'是一個指針,但改變後它也不起作用,我有'分段錯誤:11' –

+0

@SakinaLaanani當然,我應該改變爲它的名字......無論如何,看起來他沒有'噸打算調用這種方法稱爲't'。這就是爲什麼有一個錯誤 –