2010-03-31 34 views
3

在類C++中編寫我正在處理關於數據結構的項目。 第一次,我寫了所有的東西,但它聽起來像C。但據我所知,我試圖在面向對象的方法中儘可能少地使用OOP。如何解釋函數在主類

我已經在我的類中實現了一些opertation,比如add,delet,find.it,它很容易實現它。

class ARB 
{ 
     private: 
       struct BT 
       { 
         int data; 
         BT *l; 
         BT *r; 
       }; 
       struct BT *p; 
     public 
       ARB(); 
       ~ARB(); 
       void del(int n); 
       void add(int n); 
}; 

    void ARB::del(int num) 
{ 
//The code ,don't care about it 

    }; 

main() 
{ 
// 
    BTR T; 
    T.add(3); 
    T.add(5); 

}; 

但是我來到了大程序 我如何定義它必須使用二叉樹來進行堆棧

STACK ARB::MyFunct(BT* p) 
{ 
// The code don't care about it 
} 

一個梅索德如何申請它在主程序

main() 
{ 
// 
    BT T; 
    T.add(3); 
    T.add(5); 
    STACK S; 
    BT* p 
    S=T.MyFunct(p); // error C2664 cannot convert parametre 1 

}; 

**提到:我實現了Stack類

回答

0

這裏有幾個問題。首先,add()是ARB的成員函數,而不是BT。而且,BT是ARB的私有子類,所以它不能從main()訪問。 p是ARB的一個私有成員(因爲它應該是),但它應該是一個直接變量,而不是指針,所以它會被ARB自動創建和銷燬。因爲,p永遠不會被初始化,並且從ARB之外無法這樣做。我在這裏猜測,ARB使用其內部存儲的內部BT p,所以add()和del()的實現都在p上運行,並且MyFunct()應該採用BT並生成從它堆疊。如果是這樣,MyFunct()應該不帶參數,並直接引用p。

所以主()看起來像:

ARB arb; 
arb.add(3) 
arb.add(5) 
STACK s = arb.myFunct(); // which should maybe be makeStack() or such 

這一切都是假設我已經正確地推論你的意圖在這裏。

+0

謝謝您的回答 絕對的,是的,我想要做那樣的事情。我試圖實現你說的,我應該使用這個轉換看看這個函數i41.tinypic.com/25qrzbs.png我應該修改什麼! – 2010-03-31 02:11:50

+0

我應該使用「This」 – 2010-03-31 02:12:28

+0

您不需要使用「this」。只需取出myfunction()的p參數,以使該聲明看起來像LLC ARB :: myfunction()。 p已經是一個成員變量,所以你可以簡單地在成員函數中使用它,而不需要傳遞它。 – ceo 2010-03-31 17:36:37

0

這看起來像我牛逼可能是STACK班「拷貝賦值運算符」沒有被正確定義,如:

class STACK { 
public: 
    ... 
    STACK& operator=(STACK& right); // copy assign 
    ... 
}; 
在這種情況下

,拷貝構造函數的要求,它可以修改right,但STACKARB::MyFunct()回來,是暫時的,並且不能修改。 嘗試將複製構造函數更改爲STACK(STACK const& right),因此C++知道您不會修改它。 如果您使用的是編譯器支持R值引用(例如,Visual Studio 2010中),那麼你可以定義一個「移動的構造」,以及拷貝構造函數:

class STACK { 
public: 
    STACK& operator=(STACK const& right); // copy assign: note 'const' 
    STACK& operator=(STACK&& right); // move assign: note no 'const', double '&'. 
    ... 
}; 

這隻有在臨時調用值,它允許修改。

同樣的規則適用於構造函數:

class STACK { 
public: 
    STACK(); 
    STACK(STACK const& right); // copy construct 
    STACK(STACK&& right); // move construct 
    STACK& operator=(STACK const& right); // copy assign 
    STACK& operator=(STACK&& right); // move assign 
    ... 
}; 

int main() { 
    STACK S = T.MyFunct(p); // move construct S (right side is temporary) 
    S = T.MyFunct(p); // move assign S (right side is temporary) 

    STACK K = S; // copy construct K (right side is not temporary) 
    K = S; // copy assign K (right side is not temporary) 
} 
0

我假設你正在試圖遍歷樹,並建立一個堆出來的嗎?我不明白你爲什麼通過p。從你的榜樣,它看起來就像你只需創建一個指向BT對象,然後你想將它傳遞

看起來這會更有意義。

S=T.MyFunct(); 

Couldn你用this來建立你的樹嗎?我想我不確定你想要做什麼。

假設你正在試圖實現對BT對象的BT轉換成棧的功能,那麼你並不真正需要的東西傳遞(因爲MyFunctBT成員函數)。您已經可以訪問成員函數中的樹,所以您只需遍歷樹並構建堆棧。

注意:我的C++很生鏽。

+0

絕對,是的 我想做那樣的事情。 我想實現你說的,我應該用這個來轉換 看這個功能http://i41.tinypic.com/25qrzbs.png 我應該修改什麼! 我的C++很生鏽; Idon't認爲 – 2010-03-31 01:54:20

0

首先,如果第5行和第6行改變,它可能會有所幫助。

/*代碼:主要內部
1 BT T;
2 T.add(3);
3 T.add(5);
4 STACK S;
5 BT * p
6 S = T.MyFunct(p); //錯誤C2664不能轉換parametre 1
*/

線5:         BT * P; - > BT * p =&T;
第6行:         S = T.MyFunct(P) - > S = ARB :: MyFunct(P);
現在假設MyFunct做了它應該做的事情,它應該可以工作。該程序的主要問題是指針p未初始化,無法將參數減少爲無效。另外,我假定MyFunct沒有對象關係,所以在這種情況下引用T沒有多大意義。這就是爲什麼我會建議而不是後來的版本。

+0

爲什麼你認爲'ARB :: MyFunct()'是靜態的?另外,雖然他應該初始化'p',但它不會導致編譯錯誤。 – 2010-03-31 01:48:06