2016-10-24 14 views
-1

私のコードに何が間違っているかを調べようとしています。関数の定義を変更することはできません。そのまま使用する必要があります。私はコードの一番下にある演算子==をオーバーロードすることになっています。私はこのエラーを取得しておくC++オーバーロード演算子== in myStack.h

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

result = falseの後で中断する必要があります。検査を続ける必要はなく、実際には偽陽性を得ることができます –

答えて

1

あなたが上copyStackを呼び出すかについて混乱しているように見えます。 私はこの2行信じる:

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

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

であるべきそうしないと、あなたは自分自身に空のstackAをコピーして、otherStackstackBされています。 copyStackの受信者は非constです(つまり、copyStackは非constメンバー関数です)。これは失敗します。これはoperator==を実装する奇妙な方法のようですが、コピーとポップを繰り返すのではなく、既存の要素を比較できるからです。

2
copyStack(stackA); 

あなたoperator==のconstメソッドは、非constメソッドですcopyStack()メソッドを呼び出します。

constメソッドは、他のconstメソッドを呼び出すことができます。あなたのコードを簡単に調べると、代わりに行うべきことが示唆されているようです。

stackA.copyStack(*this); 

operator==は、明らかに両方のオブジェクトを一時的なStacktypeオブジェクトにコピーすることを意図しています。

関連する問題