2012-06-14 99 views
0

我的老师让班级修复这个程序中的错误。其实这似乎是一个糟糕的程序,我只是在表格中输入它的方式,并得到这个错误:C++修复编程练习

嗯现在我只是改变一些东西,但在运行时得到这个异常:Microsoft C++异常:[rethrow]在内存位置0x00000000。 。

的代码现在像这样:(变量的类名称现在是西班牙,遗憾的inconviniences)

#include <iostream> 
#include <exception> 
#include <stack> 
using namespace std; 

class EPilaVacia : public exception{ 
public: 
    const char* what() const throw(){ 
     return "Error: Pila Vacía"; 
    } 
}; 

template <class T, int max=100> 
class Pila{ 
private: 
    stack<T*> *pila; 
    int cont; 
public: 

    Pila() : cont(0){ 
     pila=new stack<T*>(); 
    } 
    virtual void apilar(T* pt){ 
     if(cont<max){ 
      pila->push(pt); //respuesta 2 
     } 
    } 
    virtual void apilar(T t){ 
     if(cont<max){ 
      pila->push(&t); //respuesta 3 
     } 
    } 
    T tope() const throw (EPilaVacia){ 
     if(cont>0){ 
      pila->top(); //respuesta 4 
     }else{ 
      throw ; //respuesta 5 
     } 
    } 
    T& desapilar() throw (EPilaVacia){ 
     if(cont>0){ 
      pila->pop(); //respuesta 6 
     }else{ 
      throw ; //respuesta 7 
     } 
    } 
    int size() const{ 
     return pila->size(); 
    } 
}; 

class Figura{ 
public: 

    virtual void print(){ 
     cout<< "FIGURA" <<endl; 
    } 
}; 

class Circulo : public Figura{ 
public: 
    void print(){ 
     cout<<"CIRCULO"<<endl; 
    } 
}; 

class Triangulo : public Figura{ 
public: 
    void print(){ 
     cout<<"TRIANGULO"<<endl; 
    } 
}; 

int main(){ 
    Pila<Figura*> *pfiguras= new Pila<Figura*>(); 
    pfiguras->apilar(new Circulo()); 
    pfiguras->apilar(new Triangulo()); 
    Pila<Figura*> pfiguras2(*pfiguras); 
    pfiguras->tope()->print(); 
    pfiguras->desapilar(); 
    pfiguras->tope()->print(); 
    pfiguras->desapilar(); 

    pfiguras2.tope()->print(); 
    system("Pause"); 
    return 0; 
} 
+0

我看到一个错误:没有很好的理由调用析构函数。另外,你的老师不应该告诉你使用'system(“PAUSE”);'。 – chris

+0

是的,系统(“暂停”)是我们需要修复的东西之一 – dlvx

+1

这是以前的学生作业吗? : - /(我同意你的'蹩脚的'评估。) – ildjarn

回答

3

这个错误是发生在行"mystack=new stack<T>;"因为这是我看到的唯一的行可能会导致此。原因是,mystack被定义为T *,而不是stack<T>。当编译器试图将新的stack<T>分配给mystack时,它发现mystack正在寻找T *,并且说“我不知道如何将stack<T>转换为T *”。

现在你已经修复了这个错误,你得到了一个来自nullptr异常的抛出。这通常可以通过在调试器下运行并查看哪条线路导致程序行为不佳来得到最佳解决。然而,通过检查,看起来你只是将两件东西推到堆栈上,然后尝试使用“top”获得第三个:pfiguras2.tope()->print();

您也在泄漏内存,但迈克尔J的评论更好地纳入了更多的挑剔,更少的“让它不崩溃”的代码区域。

+0

Thet是唯一的 – Attila

+0

嘿我改变了一些东西,我刚刚编辑了我的答案 – dlvx

+0

更新了我的答案以回应您的编辑。这似乎可以通过从头开始编写一个堆栈来了解涉及的内容,从而更好地解决问题,但看起来你的教授希望你掌握继承。 – Tawnos

7

从哪里开始?这有很多错误。

  1. 没有“using namespace std;”,它使全局命名空间混乱。相反,使用std :: list,std :: cin等使用名称空间来标识特定的对象或类。

  2. 在异常类中,不要编写自己的what()方法。只需在构造函数中初始化基类即可。

    class EPilaVacia : public std::exception 
    { 
    public: 
        EPilaVacia() 
        : std::exception("Error: Pila Vacía") 
        { 
        } 
    }; 
    
  3. 我假设班级皮拉只是一个学习练习。在现实生活中,你会使用std::stack,而不是你自己的。

  4. 如果您使用列表实现堆栈,则不需要“max”参数。

  5. 不要动态分配列表,这很愚蠢。只需使用 std::list<T*> ila;

  6. 您不需要“续”。使用ila.size();

  7. 不要像apilar()虚拟的功能。该列表是私有的,所以子类无法访问它,因此这些方法不能被重写。另外,你没有虚拟析构函数,所以继承可能是一个坏主意。

  8. void apilar(T t)是一场灾难。您按值传递t,然后存储参数的地址,然后超出范围。该功能是不必要的,失去它。

  9. 不要在方法声明中放置“throw(EPilaVacia)”。没有编译器实现它,它在新的C++ 11标准中被弃用。

  10. 在tope()中,使用ila.back(),而不是ila.pop_back()。

    T tope() const 
    { 
        if(ila.empty()) 
        { 
         throw EPilaVacia(); 
        } 
        else 
        { 
         return *ila.back(); 
        } 
    } 
    
  11. 在desapilar(),不要使用明确的,因为它会空出栈。使用这样的事情

    T& desapilar() 
    { 
        if(ila.empty()) 
        { 
         throw EPilaVacia(); 
        } 
        else 
        { 
         T *pt = ila.back(); 
         ila.pop_back(); 
         return *pt; 
        } 
    } 
    
  12. NEVER使用system("Pause");使用std::cin.get();

  13. new分配的对象不会被删除。你有内存泄漏。

可能还有更多,但应该让你开始。 注意:我已经很快写下来了。上面可能有错误,请检查我的代码,不要复制它。