首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sstream导致已删除的复制构造函数

使用sstream导致已删除的复制构造函数
EN

Stack Overflow用户
提问于 2021-10-21 19:26:02
回答 2查看 39关注 0票数 0

所以我是一名CS学生,正在做一个异常处理(Try/catch)的项目。我的老师告诉我们实现sstream库,这样我们就可以在输出包含int类型的传递参数的消息的类中使用它。由于某些未知的原因,当我使用它时,或者甚至当我声明一个stringstream类型的变量时,它会导致编译错误并显示错误消息:

“已隐式删除'tornadoException‘的复制构造函数,因为字段'ss’具有已删除的复制构造函数”

这是我的代码。我不知所措。

main.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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
EN

回答 2

Stack Overflow用户

发布于 2021-10-21 19:33:39

stringstream有一个已删除的复制构造函数,这意味着stringstream对象不能被复制。

由于您的tornadoException类有一个stringstream变量,这意味着您的类也不能被复制。

在main函数中,您通过值捕获异常,这意味着您将其复制到tornadoObj变量中-这是不允许的。

尝试将行catch(tornadoException tornadoObj)更改为catch(tornadoException& tornadoObj),这样您将获得对异常的引用,而不是它的副本。

这实际上是一个通用规则:异常应始终通过引用捕获,而不是通过复制捕获:Core Guidelines E.15

票数 1
EN

Stack Overflow用户

发布于 2021-10-21 19:36:19

好吧,我发现了错误,但我会留下这篇文章,因为我在其他地方找不到答案。问题是我在类中将stringstream buffer声明为私有变量。缓冲区需要在使用它的函数声明中进行本地声明,在这种情况下,就在加载实现文件中的缓冲区之前:

代码语言:javascript
复制
tornadoException::tornadoException(int m){
stringstream ss;
ss << "Tornado: " << m << " miles away!; and approaching!";
message = ss.str();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69667743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档