2016-10-24 91 views
-1

我想弄清楚我的代碼有什麼問題。我不能更改函數定義,我必須按原樣使用它們。我應該重載運算符==,它位於代碼的最底部。在myStack.h中的C++重載操作符==

我不斷收到此錯誤:

Error C2662 'void stackType::copyStack(const stackType &)': cannot convert 'this' pointer from 'const stackType' to 'stackType &'

這裏是我的代碼:

//Header file: myStack.h 

#ifndef H_StackType 
#define H_StackType 

#include <iostream> 
#include <cassert> 

#include "stackADT.h" 

using namespace std; 

//************************************************************* 
// This class specifies the basic operation on a stack as an 
// array. 
//************************************************************* 

template <class Type> 
class stackType: public stackADT<Type> 
{ 
public: 
    const stackType<Type>& operator=(const stackType<Type>&); 
     //Overload the assignment operator. 

    void initializeStack(); 
     //Function to initialize the stack to an empty state. 
     //Postcondition: stackTop = 0; 

    bool isEmptyStack() const; 
     //Function to determine whether the stack is empty. 
     //Postcondition: Returns true if the stack is empty, 
     // otherwise returns false. 

    bool isFullStack() const; 
     //Function to determine whether the stack is full. 
     //Postcondition: Returns true if the stack is full, 
     // otherwise returns false. 

    void push(const Type& newItem); 
     //Function to add newItem to the stack. 
     //Precondition: The stack exists and is not full. 
     //Postcondition: The stack is changed and newItem is 
     // added to the top of the stack. 

    Type top() const; 
     //Function to return the top element of the stack. 
     //Precondition: The stack exists and is not empty. 
     //Postcondition: If the stack is empty, the program 
     // terminates; otherwise, the top element of the stack 
     // is returned. 

    void pop(); 
     //Function to remove the top element of the stack. 
     //Precondition: The stack exists and is not empty. 
     //Postcondition: The stack is changed and the top element is 
     // removed from the stack. 

    bool operator==(const stackType<Type>& otherStack) const; 

    stackType(int stackSize = 100); 
     //Constructor 
     //Create an array of the size stackSize to hold 
     //the stack elements. The default stack size is 100. 
     //Postcondition: The variable list contains the base address 
     // of the array, stackTop = 0, and maxStackSize = stackSize 

    stackType(const stackType<Type>& otherStack); 
     //Copy constructor 

    ~stackType(); 
     //Destructor 
     //Remove all the elements from the stack. 
     //Postcondition: The array (list) holding the stack 
     // elements is deleted. 

private: 
    int maxStackSize; //variable to store the maximum stack size 
    int stackTop;  //variable to point to the top of the stack 
    Type *list; //pointer to the array that holds the stack elements 

    void copyStack(const stackType<Type>& otherStack); 
     //Function to make a copy of otherStack. 
     //Postcondition: A copy of otherStack is created and assigned 
     // to this stack. 
}; 

template <class Type> 
void stackType<Type>::initializeStack() 
{ 
    stackTop = 0; 
}//end initializeStack 

template <class Type> 
bool stackType<Type>::isEmptyStack() const 
{ 
    return(stackTop == 0); 
}//end isEmptyStack 

template <class Type> 
bool stackType<Type>::isFullStack() const 
{ 
    return(stackTop == maxStackSize); 
} //end isFullStack 

template <class Type> 
void stackType<Type>::push(const Type& newItem) 
{ 
    if (!isFullStack()) 
    { 
     list[stackTop] = newItem; //add newItem to the 
            //top of the stack 
     stackTop++; //increment stackTop 
    } 
    else 
     cout << "Cannot add to a full stack." << endl; 
}//end push 

template <class Type> 
Type stackType<Type>::top() const 
{ 
    assert(stackTop != 0);   //if stack is empty, 
            //terminate the program 
    return list[stackTop - 1];  //return the element of the 
            //stack indicated by 
            //stackTop - 1 
}//end top 

template <class Type> 
void stackType<Type>::pop() 
{ 
    if (!isEmptyStack()) 
     stackTop--;     //decrement stackTop 
    else 
     cout << "Cannot remove from an empty stack." << endl; 
}//end pop 

template <class Type> 
stackType<Type>::stackType(int stackSize) 
{ 
    if (stackSize <= 0) 
    { 
     cout << "Size of the array to hold the stack must " 
      << "be positive." << endl; 
     cout << "Creating an array of size 100." << endl; 

     maxStackSize = 100; 
    } 
    else 
     maxStackSize = stackSize; //set the stack size to 
            //the value specified by 
            //the parameter stackSize 

    stackTop = 0;     //set stackTop to 0 
    list = new Type[maxStackSize]; //create the array to 
            //hold the stack elements 
}//end constructor 

template <class Type> 
stackType<Type>::~stackType() //destructor 
{ 
    delete[] list; //deallocate the memory occupied 
        //by the array 
}//end destructor 

template <class Type> 
void stackType<Type>::copyStack(const stackType<Type>& otherStack) 
{ 
    delete[] list; 
    maxStackSize = otherStack.maxStackSize; 
    stackTop = otherStack.stackTop; 

    list = new Type[maxStackSize]; 

    //copy otherStack into this stack 
    for (int j = 0; j < stackTop; j++) 
     list[j] = otherStack.list[j]; 
} //end copyStack 


template <class Type> 
stackType<Type>::stackType(const stackType<Type>& otherStack) 
{ 
    list = NULL; 

    copyStack(otherStack); 
}//end copy constructor 

template <class Type> 
const stackType<Type>& stackType<Type>::operator= (const stackType<Type>& otherStack) 
{ 
    if (this != &otherStack) //avoid self-copy 
     copyStack(otherStack); 

    return *this; 
} //end operator= 

template <class Type> 
bool stackType<Type>::operator== (const stackType<Type>& otherStack) const 
{ 
    stackType<Type> stackA, stackB; 
    bool result = false; 
    copyStack(stackA); 
    otherStack.copyStack(stackB); 

    while (!stackA.isEmptyStack() && !stackB.isEmptyStack()) 
    { 
     if (stackA.top() == stackB.top()) 
     { 
      stackA.pop(); 
      stackB.pop(); 
      if (stackA.isEmptyStack() && stackB.isEmptyStack()) 
      { 
       result = true; 
      } 
     } 
     else 
     { 
      result = false; 
     } 

    } 

    return result; 

} 

#endif 
+0

你讀過'copystack'的文檔嗎? 「一個otherStack的副本被創建並分配給這個堆棧。」這是否符合你稱之爲的方式? – Angew

+0

您應該在結果= false後中斷。沒有必要繼續檢查,事實上你可以得到一個誤報 –

回答

1

它看起來像你困惑什麼叫copyStack上。 我相信這兩條線:

copyStack(stackA);               
otherStack.copyStack(stackB); 

應該

stackA.copyStack(*this);               
stackB.copyStack(otherStack); 

否則,您要複製空stackA到自己,然後stackBotherStack。由於copyStack的接收器是非常量(即copyStack是非常量成員函數),因此會失敗。這似乎是一種實施operator==的奇怪方式,因爲您可以比較現有元素,而不是複製和重複彈出。

2
copyStack(stackA); 

operator== const的方法調用copyStack()方法,這是一個非const方法。

A const方法只能調用其他const方法。你的代碼的簡短檢查似乎表明你的意思是做

stackA.copyStack(*this); 

改爲。您的operator==顯然打算先將正在比較的兩個對象複製到臨時對象Stacktype中。