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;
}
}