Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/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+中的io类继承的异常类+; 请原谅我的C++ NIVEET E/P>_C++_Templates_Exception_Inheritance_Stringstream - Fatal编程技术网

创建从C+中的io类继承的异常类+; 请原谅我的C++ NIVEET E/P>

创建从C+中的io类继承的异常类+; 请原谅我的C++ NIVEET E/P>,c++,templates,exception,inheritance,stringstream,C++,Templates,Exception,Inheritance,Stringstream,我正在考虑创建从std::stringstream继承的异常类,以便可以使用stringstream的操作符(std中的大多数)类型被设计为不用作基类。仅将它们用作成员变量 要向异常发送消息,可以执行以下操作: class ExceptionXYZ { public: ExceptionXYZ(const std::string& msg) : msg_(msg) {} const std::string& get_message() const { return m

我正在考虑创建从std::stringstream继承的异常类,以便可以使用stringstream的操作符(std中的大多数)类型被设计为不用作基类。仅将它们用作成员变量

要向异常发送消息,可以执行以下操作:

class ExceptionXYZ
{
public:
   ExceptionXYZ(const std::string& msg) : msg_(msg) {}
   const std::string& get_message() const { return msg_; }
private:
   std::string msg_;
};

std::stringstream ss;
ss << "Error " << 42;
throw ExceptionXYZ(ss.str());
throw ExceptionXYZ() << "some " << information << " or " << other;
类例外xyz
{
公众:
ExceptionXYZ(const std::string&msg):msg_(msg){}
const std::string&get_message()const{return msg_;}
私人:
std::字符串msg_;
};
std::stringstream-ss;

ss您不应该仅仅为了在构造期间使用流类而继承流类。如果您确实需要构建错误消息,您可以选择存储根据请求构建错误消息所需的信息,或者在构建时构建错误消息

从声音上看,你想做这样的事情:

class ExceptionXYZ
{
public:
   ExceptionXYZ(const std::string& msg) : msg_(msg) {}
   const std::string& get_message() const { return msg_; }
private:
   std::string msg_;
};

std::stringstream ss;
ss << "Error " << 42;
throw ExceptionXYZ(ss.str());
throw ExceptionXYZ() << "some " << information << " or " << other;

throw ExceptionXYZ()您不能使用
std::stringstream
作为异常的基类,因为您不能复制或移动
stringstream
(如果您查看错误消息,因为
streambuffer
内部),这是要抛出对象的要求。因此,当我编写此类代码时,它无法编译:

class ExceptionXYZ : public std::stringstream {};

void test_except() throw (ExceptionXYZ)
{
  ExceptionXYZ xyz;

  xyz << "This exception is useless";
  throw xyz;
}
class ExceptionXYZ:public std::stringstream{};
void test_except()抛出(ExceptionXYZ)
{
例外xyz-xyz;

XYZ我不明白为什么你会想这样做。你能解释一下你的用例吗?错误发生在哪一行?实际上,标准C++库中有两个类,它们是从(例如,代码> STD::StudiBuf < /C>)和各种方面派生而来的。类
std::istream
std::ostream
也打算用作基类,尽管只用于初始化各自的基类并保存必要的对象(例如
std::filebuf
std::stringbuf
)的流。从不说从不;)我将其改为“most”例如,如果你使用
向量
列表
映射
设置
作为基类,你的设计可能有点可疑…@DietmarKühl:你有没有一个参考文件表明
istream
ostream
打算用作基类?我从来没有见过这个D:IsFrase和 STD::ItgIsStuts是从<代码> STD::ISTRAMA< /COD>。同样地,对于<代码>:ST::OFFROWS 和。如果我记得正确的话,Nicolai Josuttis的“C++标准库”描述了如何从流类中派生。(当然,你可以把这损坏作为参考,因为我写了IOFSCOPE章节的主要部分)。@迪特马克胡尔:现在我认为I/OFFROW和I/OSTRIGNSWATH是STD本身的一部分,因此不是用户损坏的“用户”。在一些C++书籍中我拾取了成语。“永远不要从STD类派生-总是将它们用作成员”,但这可能已经过时了。。。