C++ 奥斯特雷姆公司;操作员<&书信电报;不带刷新的segfaults()
我有一个自定义类,我为它定义了一个自定义castC++ 奥斯特雷姆公司;操作员<&书信电报;不带刷新的segfaults(),c++,operators,iostream,C++,Operators,Iostream,我有一个自定义类,我为它定义了一个自定义castoperator char(),称它为a。现在,假设我想要一个这个类的数组,但是有附加的功能,所以我定义了一个新的类B,用std::vector类型的成员变量array来实现这一点 我希望B处理的事情之一是将其数据打印到屏幕上,因此我创建了一个friend函数 ostream& operator<<(ostream& out, const B& b) { // invoking custom cast wo
operator char()
,称它为a
。现在,假设我想要一个这个类的数组,但是有附加的功能,所以我定义了一个新的类B
,用std::vector
类型的成员变量array
来实现这一点
我希望B
处理的事情之一是将其数据打印到屏幕上,因此我创建了一个friend
函数
ostream& operator<<(ostream& out, const B& b)
{
// invoking custom cast works fine here
for(int i=0;i<array.size();++i) out.put((char)array[i]);
// without the following out.flush() we get segfault
out.flush()
}
ostream&operator您必须在那里返回一些内容。当然,您已经获得了流,因此您应该:
return out;
作为操作员的最后一行。请注意,可能是偶然的,调用out.flush()
生成了一些寄存器(比如EAX)来保存流的值,因此被返回(根据标准调用约定),这是调用方所期望的。但是您必须添加最后一个返回值
。您必须在那里返回一些内容。当然,您已经获得了流,因此您应该:
return out;
作为操作员的最后一行。请注意,可能是偶然的,调用out.flush()
生成了一些寄存器(比如EAX)来保存流的值,因此被返回(根据标准调用约定),这是调用方所期望的。但是您必须添加最后一个返回值
。您也可以发布A
的代码吗?可能是因为您的操作符char()
在某个地方犯了一个错误,之后您会受到惩罚。调用out.flush()
时幸运的一个事实可能是因为调用了一个函数,修改了堆栈上可能出现的混乱,将其变成了一个更容易忍受的混乱!你能把A
的代码也贴出来吗?可能是因为您的操作符char()
在某个地方犯了一个错误,之后您会受到惩罚。调用out.flush()
时幸运的一个事实可能是因为调用了一个函数,修改了堆栈上可能出现的混乱,将其变成了一个更容易忍受的混乱!就这样!这就是我深夜编码得到的。令人恼火的是,编译器没有警告我在非void中不返回。另外,为可能解释为什么out.flush()
不会崩溃而干杯。很高兴提供帮助!:)你看,有人说在汇编程序中编程不算数,但它算数:)事实上,flush
也会返回流,所以实际上函数实际上好像返回了流,但同样,return
是必要的。的确,我今天的课程甚至是关于使用-Wall
的微小的概念验证代码片段。就是这样!这就是我深夜编码得到的。令人恼火的是,编译器没有警告我在非void中不返回。另外,为可能解释为什么out.flush()
不会崩溃而干杯。很高兴提供帮助!:)你看,有人说在汇编程序中编程不算数,但它算数:)事实上,flush
也会返回流,所以实际上函数实际上好像返回了流,但同样,return
是必要的。的确,我今天的课程甚至是关于代码使用的微小概念验证部分-Wall
。