2015-11-23 43 views
-1

我正在爲我的CS類獲取一堆字符串(String ADT,我自己做的),但是我被它的一部分所捕獲,並且無法弄清楚什麼是錯誤的。當我使用Makefile編譯代碼時,出現以下錯誤:test_default_ctor:./stack.hpp:53:T stack :: pop()[T = String]:聲明'TOS!= 0'失敗。C++ - >斷言失敗堆棧

由於我在頭文件中聲明的pop()函數導致我的測試未運行。這裏是我的代碼片段:

#ifndef STACK_HPP 
#define STACK_HPP 

#include <iostream> 
#include <cassert> 
#include <new> 

#include "string/string.hpp" 

template <typename T> 
class node{ 
public: 
    node(): next(0), data(){}; 
    node(const T& x): next(0), data(x){}; 

    node<T> *next; 
    T data; 
    // EXAM QUESTION: This class is going to be used by another class so all needs to be accessable 
    // Including node p and node v. 
}; 

template <typename T> 
class stack{ 
public: 
    stack(): TOS(0){}; 
    ~stack(); 
    stack(const stack<T>&); 
    void swap(stack<T>&); 
    stack<T>& operator=(stack<T> rhs){swap(rhs); return *this;}; 
    bool operator==(const stack<T>&) const; 
    bool operator!=(const stack<T>& rhs) const {return !(*this == rhs);}; 
    friend std::ostream& operator<<(std::ostream&, const stack<T>&); 
    bool isEmpty()const{return TOS == 0;}; 
    bool isFull(void)const; 
    T pop(void); 
    void push(const T&); 
    int slength()const{String nuevo; return nuevo.length();}; 
private: 
    node<T> *TOS; 
}; 

template <typename T> 
T stack<T>::pop(){ 
    assert(TOS!=0); 
    node<T> *temp=TOS; 
    T result=TOS -> data; 
    TOS=TOS -> next; 
    int len=slength(); 
    --len; 
    delete temp; 
    return result; 
} 

template <typename T> 
bool stack<T>::operator==(const stack<T>& rhs) const{ 
    stack<T> left = *this; 
    stack<T> right = rhs; 

    if(slength() != rhs.slength()) 
      return false; 
    if(left.pop() != right.pop()) 
      return false;  
    else     
      return true; 
} 

,這裏是我的測試:

#include "stack.hpp" 
#include "string/string.hpp" 

#include <cassert> 

int main() 
{ 
    { 
      stack<String> test; 
      assert(test == stack<String>()); 
      assert(test.slength()==0); 
    } 


    std::cout<<"Done testing default constructor!"<<std::endl; 

    return 0; 
} 

我知道這是發生,因爲堆棧(TOS)的頂部是0,但我不知道爲什麼斷言不會讓它通過,儘管在我的測試中pop函數根本沒有被調用。誰能提供任何幫助?

+0

我猜你沒有顯示所有的代碼和'pop'被稱爲某處。 –

+0

在你說完之後退後一步,我覺得這可能是我的平等運營商的問題,所以我在那裏編輯了那個問題,我認爲這可能是問題所在。 – Cody

+0

請參閱下面的答案。 –

回答

0

當您發佈您的operator==代碼後,很明顯發生了什麼。該運算符在空堆棧上調用pop。您必須重寫您的operator==函數,以便它不使用poppop修改堆棧,你不想使用它。您應該循環遍歷堆棧中的每個節點並比較它們的平等性。

此外,我會消除下面強調的兩條線。這使得您的堆棧的副本,一般而言,如果不需要,您不想這樣做。另外,由於你的類包含指針,所以你應該正確地編寫operator=。由於代碼正在使用編譯器生成的默認operator=,因此這是不正確的。

template <typename T> 
bool stack<T>::operator==(const stack<T>& rhs) const{ 
    stack<T> left = *this; // remove this 
    stack<T> right = rhs; // remove this 

    if(slength() != rhs.slength()) 
      return false; 
    if(left.pop() != right.pop()) 
      return false;  
    else     
      return true; 
} 
+0

啊,謝謝。當我檢查它時,我完全忽略了這些。所以你說我的operator =在彈出窗口上是不正確的?我在那裏,但這是我有:堆棧&運營商=(堆棧 rhs){swap(rhs); return * this;}; – Cody

+0

對不起,我沒有看到你的'operator ='。它看起來是正確的,假設你的'swap'和'copy構造函數'正確實現。 –