这个单一继承代码没有错误,但是当我运行这个void函数void B::get_ab()
按预期首先执行,但是函数(cin>>a>>b;
)中的第二行首先执行,然后是第一行,有人知道这里发生了什么吗?
#include<iostream>
#include<stdio.h>
using std::equal_range;
using std::lower_bound;
using std::upper_bound;
using std::pair;
using std::string;
using std::getline;
using std::vector;
using std::cout;
using std::ios;
using std::set;
using std::cin;
class B
{
int a;
public: int b;
void get_ab();
int get_a(void);
void show_a(void);
};
class D:private B{
int c;
public: void mult();
void display();
};
void B::get_ab()
{
cout<<"Enter values of a&b";
cin>>a>>b;
}
int B::get_a()
{
return a;
}
void B::show_a()
{
cout<<"a="<<a<<"n";
}
void D::mult()
{
get_ab();
c=b*get_a();
}
void D::display()
{
show_a();
cout<<"b="<<b<<"n"<<"c="<<c<<"n";
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
D d;
d.mult();
d.display();
return 0;
}```
这样做的原因是您将cin
从cin.tie(0);
中的cout
中解开。在程序提示用户输入之前,不能期望输出被刷新。
如果出于某种原因需要保留此配置(即:未绑定的流)并且仍然需要打印提示符,则需要显式刷新输出(例如:通过使用std::flush
或std::endl
I/O操纵符)。
你可能想检查这个线程:强制std::cout
冲洗打印到屏幕。
和这个:为什么我们需要把std::cin
和std::cout
绑在一起
执行顺序不是问题。这是关于输出缓冲和刷新。
应该显式刷新提示输出。
您可能不希望在那里使用换行符。可以使用不带换行符的显式刷新,即
https://en.cppreference.com/w/cpp/io/manip/flush
我认为问题可能出在这两行代码上:
ios::sync_with_stdio(0);
cin.tie(0);
第二行允许stdin和out半独立地操作,不确保一个调用的缓冲区在另一个调用发生之前已经清空。我不认为继承与此有任何关系。试着把它们注释掉,看看会发生什么。
你为什么要用它们?这里有一个很好的关于他们做什么的讨论:
ios_base::sync_with_stdio(false);
cin.tie(空);