所以我是一名CS学生,正在做一个异常处理(Try/catch)的项目。我的老师告诉我们实现sstream库,这样我们就可以在输出包含int类型的传递参数的消息的类中使用它。由于某些未知的原因,当我使用它时,或者甚至当我声明一个stringstream类型的变量时,它会导致编译错误并显示错误消息:
“已隐式删除'tornadoException‘的复制构造函数,因为字段'ss’具有已删除的复制构造函数”
这是我的代码。我不知所措。
main.cpp
#include <iostream>
#include <string>
#include <sstream>
#include "tornadoException.h"
using namespace std;
int main()
{
try{
int tornado = 0;
cout << "Enter distance of tornado: ";
cin >> tornado;
if(tornado > 2){
throw tornadoException(tornado);
}
else{
throw tornadoException();
}
}
catch(tornadoException tornadoObj){
cout << tornadoObj.what();
}
}tornadoException.cpp
#include <iostream>
#include <string>
#include <sstream>
#include "tornadoException.h"
using namespace std;
tornadoException::tornadoException(){
message = "Tornado: Take cover immediately!";
}
tornadoException::tornadoException(int m){
ss << "Tornado: " << m << "miles away!; and approaching!";
message = ss.str();
}
string tornadoException::what(){
return message;
}tornadoException.h
#ifndef tornadoException_h
#define tornadoException_h
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class tornadoException{
public:
tornadoException();
tornadoException(int m);
string what();
private:
stringstream ss;
string message;
};
#endif发布于 2021-10-21 19:33:39
stringstream有一个已删除的复制构造函数,这意味着stringstream对象不能被复制。
由于您的tornadoException类有一个stringstream变量,这意味着您的类也不能被复制。
在main函数中,您通过值捕获异常,这意味着您将其复制到tornadoObj变量中-这是不允许的。
尝试将行catch(tornadoException tornadoObj)更改为catch(tornadoException& tornadoObj),这样您将获得对异常的引用,而不是它的副本。
这实际上是一个通用规则:异常应始终通过引用捕获,而不是通过复制捕获:Core Guidelines E.15
发布于 2021-10-21 19:36:19
好吧,我发现了错误,但我会留下这篇文章,因为我在其他地方找不到答案。问题是我在类中将stringstream buffer声明为私有变量。缓冲区需要在使用它的函数声明中进行本地声明,在这种情况下,就在加载实现文件中的缓冲区之前:
tornadoException::tornadoException(int m){
stringstream ss;
ss << "Tornado: " << m << " miles away!; and approaching!";
message = ss.str();
}https://stackoverflow.com/questions/69667743
复制相似问题