Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;修复编程练习_C++ - Fatal编程技术网

C++ C++;修复编程练习

C++ C++;修复编程练习,c++,C++,我的老师要求全班同学纠正这个程序中的错误。实际上,这似乎是一个糟糕的节目;我只是在工作表中准确地输入了它,并得到了以下错误: 我现在只需要改变一些事情,但是在运行时得到这个异常:微软C++异常:[重新投掷]在内存位置0x00亿…< /p> 代码现在是这样的:(变量an类名现在是西班牙语,很抱歉不协调) #包括 #包括 #包括 使用名称空间std; 类EPilaVacia:公共异常{ 公众: 常量字符*what()常量抛出(){ 返回“Error:Pila Vacía”; } }; 模板 皮拉级{

我的老师要求全班同学纠正这个程序中的错误。实际上,这似乎是一个糟糕的节目;我只是在工作表中准确地输入了它,并得到了以下错误:

我现在只需要改变一些事情,但是在运行时得到这个异常:微软C++异常:[重新投掷]在内存位置0x00亿…< /p> 代码现在是这样的:(变量an类名现在是西班牙语,很抱歉不协调)

#包括
#包括
#包括
使用名称空间std;
类EPilaVacia:公共异常{
公众:
常量字符*what()常量抛出(){
返回“Error:Pila Vacía”;
}
};
模板
皮拉级{
私人:
堆栈*pila;
内部控制;
公众:
Pila():续(0){
pila=新堆栈();
}
虚空小径(T*pt){
if(contpush(pt);//respuesta 2
}
}
虚空小径(T){
if(contpush&t);//respuesta 3
}
}
T tope()常量抛出(EPilaVacia){
如果(续>0){
pila->top();//respuesta 4
}否则{
抛出;//respuesta 5
}
}
T&desapilar()投掷(EPilaVacia){
如果(续>0){
pila->pop();//respuesta 6
}否则{
抛出;//respuesta 7
}
}
int size()常量{
返回pila->size();
}
};
类图形{
公众:
虚拟空打印(){

cout这个错误是在第
行“mystack=new stack;”“
上发生的,因为这是我看到的唯一一行可能导致这个错误的。原因是mystack被定义为T*,而不是
stack
。当编译器试图将新的
stack
分配给mystack时,它看到mystack正在寻找T*,并说“我不知道如何将
堆叠成t*”

现在您已经修复了该错误,您将从nullptr exception获得一个抛出。通常,通过在调试器下运行该命令并查看是哪一行导致您的程序表现不佳,可以最好地解决此问题。但是,通过检查,您似乎只在堆栈上推送了两个内容,然后尝试使用“top”“要获得第三个:
pfiguras2.tope()->print();


您也在泄漏内存,但Michael J的评论在代码中更挑剔、更少“使其不崩溃”的部分做得更好。

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

  • 如果没有“using namespace std;”,它会使全局名称空间变得混乱。相反,使用std::list、std::cin等,使用名称空间来标识特定的对象或类

  • 在exception类中,不要编写自己的
    what()
    方法。只需在构造函数中初始化基类

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

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

  • 不要动态分配列表,这很愚蠢。只需使用
    std::列出ila;

  • 您不需要“cont”。使用
    ila.size();

  • 不要将apilar()之类的函数设置为虚拟。列表是私有的,因此子类无法访问它,因此无法重写方法。此外,您没有虚拟析构函数,因此继承可能不是一个好主意

  • void apilar(T T)是一个灾难。您通过值传递T,然后存储参数的地址,该地址随后超出范围。该函数不必要,请丢失它

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

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

  • 在desapilar()中,不要使用clear,因为它会清空堆栈

    T& desapilar()
    {
        if(ila.empty())
        {
            throw EPilaVacia();
        }
        else
        {
            T *pt = ila.back();
            ila.pop_back();
            return *pt;
        }
    }
    
  • 绝不使用
    系统(“暂停”);
    使用
    std::cin.get();

  • 使用
    new
    分配的对象永远不会被删除。内存泄漏

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

    我看到一个错误:没有充分的理由调用析构函数。另外,你的老师不应该告诉你使用
    系统(“暂停”);
    。是的,实际上是系统(“暂停”)作为我们需要解决的问题之一,这是前一个学生的家庭作业吗?:-/(我同意你的“蹩脚”评估。)我很困惑。我认为Pila类不能很好地与堆栈配合使用。该类会异常使用堆栈。例如,如果您通过Pila实例将项目推入堆栈,cont member变量将永远不会增加。根据您的编辑更新了我的答案。这似乎可以通过让您从我们努力学习其中的内容,但似乎你们的教授希望你们掌握继承权。
    T tope() const 
    {
        if(ila.empty())
        {
            throw EPilaVacia();
        }
        else
        {
            return *ila.back();
        }
    }
    
    T& desapilar()
    {
        if(ila.empty())
        {
            throw EPilaVacia();
        }
        else
        {
            T *pt = ila.back();
            ila.pop_back();
            return *pt;
        }
    }