QT5语句执行顺序错误的问题,令我百思不得其解

哈利_蜘蛛侠 2016-01-21 09:58:25
这样的问题出现过好几次了,就用今天遇到的情况来举例吧。就是一个很简单的类:
这是.pro文件:

#-------------------------------------------------
#
# Project created by QtCreator 2016-01-21T21:08:12
#
#-------------------------------------------------

QT += core

QT -= gui

TARGET = Exercise2-15-2
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app


SOURCES += main.cpp \
fraction.cpp

HEADERS += \
fraction.h

这个是头文件:

#ifndef FRACTION
#define FRACTION

#include <QString>

class Fraction
{
public:
// Constructors
Fraction(int numerator = 0, int denominator = 1);

void set(int numerator, int denominator);
QString toString() const;
double toDouble() const;
private:
int m_Numerator;
int m_Denominator;
};

#endif // FRACTION

这个是类的实现文件:

#include "fraction.h"

// Constructors
Fraction::Fraction(int numerator, int denominator)
: m_Numerator(numerator), m_Denominator(denominator)
{
// Empty statement
}

void Fraction::set(int numerator, int denominator)
{
m_Numerator = numerator;
m_Denominator = denominator;
}

QString Fraction::toString() const
{
return QString("%1/%2").arg(m_Numerator).arg(m_Denominator);
}

double Fraction::toDouble() const
{
return static_cast<double>(m_Numerator)/static_cast<double>(m_Denominator);
}

这个是测试用的文件:

#include "fraction.h"
#include <QTextStream>

QTextStream cout(stdout);
QTextStream cin(stdin);
QTextStream cerr(stderr);

int main()
{
int num(0), denom(1);
cout << "\nInput first the numerator, then the denominator:\t";
cin >> num >> denom;
denom = (denom == 0) ? 1 : denom;
Fraction a(num, denom);
cout << "\nFraction a = " << a.toString() << ", which is approximately "
<< a.toDouble() << endl;

cout << "\nAgain, input first the numerator, then the denominator:\t";
cin >> num >> denom;
denom = (denom == 0) ? 1 : denom;
Fraction b(num, denom);
cout << "\nFraction b = " << b.toString() << ", which is approximately "
<< b.toDouble() << endl;

return 0;
}

然后run的时候,神奇的事情发生了:竟然让我先输入两个整数,然后才出现提示语句!输入两个整数后,控制台窗口如下:


请问这到底是什么情况?怎么解决呢?
...全文
363 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
千荒 2016-01-26
  • 打赏
  • 举报
回复
输出缓冲机制的锅,其实已经在输出来了只是没有显示,一般出现这种情况就利用行缓冲吧,因为只要输出遇到换行就一定会刷新显示到换行符位置的,所有就像前面说的,输出语句结尾加换行符“\n” 或者<<endl;
狂奔的蜗牛 2016-01-22
  • 打赏
  • 举报
回复
c++ 输入输出的缓冲机制 cin.tie(&cout) 保证cin在刷新之前,先刷新cout缓冲区中的数据
void_main_void 2016-01-22
  • 打赏
  • 举报
回复
这个是C++标输出也有同样的问题啊。楼主没想到么。。
冷静忍耐 2016-01-22
  • 打赏
  • 举报
回复
一般build就可以了,像改了什么资源文件或者编译中间文件等等,才需要rebuild。 clean一般只是在出现一些神奇错误下才使用。
哈利_蜘蛛侠 2016-01-22
  • 打赏
  • 举报
回复
引用 3 楼 dext 的回复:
这个是 QTextStream 的缓存机制,没什么大不了的。解决方法 就是 在每次输出后 使用 flush() 或者 每次输出 使用 endl 结尾。 至于为什么,自己找找吧。
还有其他的比较神奇的事情:对代码进行修改后,貌似要先clean,然后再build。如果用rebuild或者直接build的话,会出现很神奇的错误。但是我用VS的时候一直用build来对更新后的项目进行构建,也没什么问题啊。
哈利_蜘蛛侠 2016-01-22
  • 打赏
  • 举报
回复
引用 3 楼 dext 的回复:
这个是 QTextStream 的缓存机制,没什么大不了的。解决方法 就是 在每次输出后 使用 flush() 或者 每次输出 使用 endl 结尾。 至于为什么,自己找找吧。
原来是这样咩?太可怕了。555~多谢你了。害得我都对继续学习QT5没有信心了。
dext 2016-01-22
  • 打赏
  • 举报
回复
这个是 QTextStream 的缓存机制,没什么大不了的。解决方法 就是 在每次输出后 使用 flush() 或者 每次输出 使用 endl 结尾。 至于为什么,自己找找吧。
lh199302 2016-01-21
  • 打赏
  • 举报
回复
你随便输入点数数试试?
哈利_蜘蛛侠 2016-01-21
  • 打赏
  • 举报
回复
引用 1 楼 lh199302 的回复:
你随便输入点数数试试?
??? 那个2 5就是我输入的呀

16,794

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧