2013-03-30 34 views
0

這裏是頭文件的代碼,stack.h:不能一個指針賦給另一個因爲類型不匹配,或者使編譯器說:

#include <iostream> 
using namespace std; 
//template <class T> struct stackNode; 
//template <class T> 
struct stackNode { 
int item; 
stackNode *Next; 
stackNode *Prev; 
//stackNode *Temp; 

}; 
class stackClass { 
public: 
stackClass(); 
stackClass(const stackClass &right); 
~stackClass(); 
stackClass &operator=(const stackClass &right); 
int counter; 
int StackIsEmpty(void); 
//stackNode *origptr; 
void push(int item, bool &success); 
int pop(void); 

int GetStackTop(void); 

protected: 
stackNode *GetStackTopPtr(void); 


private: 

stackNode *Top; 
stackNode *Current; 
//stackNode *origptr; 
//stackNode<T> *Next; 
}; 

下面是實現文件,stack.cpp:

#include "stack.h" 

//constructor 
stackClass::stackClass(){ 
     Top = NULL; 
     int counter = 0; 
      } 

//copy constructor 
stackClass::stackClass(const stackClass &right){ 
     if (right.Top == NULL){ 
     Top = NULL; 
     counter = 0; 
      } 
     else { 
      stackNode * origptr = right.GetStackTopPtr; 
     stackNode * currptr; 
     Top = new stackNode; 
     currptr = Top; 

     while(origptr->Next != NULL){ 
      currptr->item = origptr->item; 
      origptr = origptr->Next; 
      currptr->Next = new stackNode; 
      currptr->Next->item = origptr->item; 
      currptr = currptr-> Next; 
      } 
     currptr->Next = NULL; 
      } 
    } 

//Destructor 
stackClass::~stackClass(){ 
    while (Top != NULL){ 
     pop(); 
        }    
      } 
//push 
void stackClass::push(int item, bool &success){ 
    success = false; 
    if (Top == NULL){ 
     Top = new stackNode; 
     Top -> item = item; 
     Top -> Next = NULL; 
     Top -> Prev = NULL; 
     Current = Top; 
     counter++; 
     success = true; 
     } 
    else { 
     stackNode * Temp = new stackNode; 
     Current -> Next = Temp; 
     Temp -> Prev = Current; 
     Temp -> Next = NULL; 
     Current = Temp; 
     Current -> item = item; 
     counter++; 
     success = true; 
     } 

    } 

int stackClass::pop(void){  

    if (Top == NULL){ 
     cout<<"Stack is empty"<<endl; 
     } 

    else if (counter == 1){ 
     Top = NULL; 
     delete Current; 
     counter--; 
     } 

    else if(counter > 1){ 
     Current -> Prev -> Next = NULL; 
     Current = Current -> Prev; 
     stackNode * Temp = Current -> Next; 
     delete Temp; 
     counter--;    
     } 
    } 

int stackClass::StackIsEmpty(void){ 
    if (counter == 0) 
     return 1; 
    else 
     return 0; 
    } 

int stackClass::GetStackTop(void){ 

    int item = Top->item ; 
    return item;  
      } 

stackNode *stackClass::GetStackTopPtr(void){ 
    return Top;   
      } 

這裏是問題,

stack.cpp: In copy constructor ‘stackClass::stackClass(const stackClass&)’:
stack.cpp:19:31: error: cannot convert ‘stackClass::GetStackTopPtr’ from type ‘stackNode* (stackClass::)()’ to type ‘stackNode*’

我不知道爲什麼編譯器會抱怨,似乎在問題1行在stack.cpp中,第19行,right.GetStackTopPrt將返回一個stackNode *類型,該類型應該很好地分配給左側的stackNode*

請幫助,如果你知道問題是什麼。謝謝!

回答

5

你試圖設置

stackNode * origptr = right.GetStackTopPtr; 

,其中左側是一個stackNode指針,右手邊是功能GetStackTopPtr。我覺得你的意思寫:

stackNode * origptr = right.GetStackTopPtr(); // Note the parentheses! 

請記住,編譯器是在搞清楚類型非常好,而且幾乎總是對這些事情。不要以爲編譯器是錯的,找一個你先犯的錯誤!

+0

Thanks.I沒有真正抱怨編譯器抱怨,我只是說它是這樣做的。 – radashevskiy

+0

@radashevskiy啊,夠公平的。我會同意有一種閱讀編譯器錯誤消息的藝術。這是否解決了這個問題? – Xymostech

+0

這當然是一個很大的疏忽,感謝你指出了這一點。然而,在我解決這個問題之後,該行仍然存在問題,所以我必須在頭文件和實現文件中將const字添加到 stackNode * GetStackTopPtr(void)的末尾。還必須修復pop()以返回彈出節點的值。 而且還有很多工作要做! – radashevskiy

相關問題