当我尝试编译代码时
istream in;
if (argc==1)
in=cin;
else
{
ifstream ifn(argv[1]);
in=ifn;
}
Run Code Online (Sandbox Code Playgroud)
gcc失败了,抱怨operator=是私密的.有没有办法istream根据条件设置不同的值?
您可以使用指针in,例如:
istream *in;
ifstream ifn;
if (argc==1) {
in=&cin;
} else {
ifn.open(argv[1]);
in=&ifn;
}
Run Code Online (Sandbox Code Playgroud)
小智 4
您可以用另一个替换 cin 的streambuf,在某些程序中,这比传递 istreams 而不直接引用 cin 的一般策略更简单。
int main(int argc, char* argv[]) {
ifstream input;
streambuf* orig_cin = 0;
if (argc >= 2) {
input.open(argv[1]);
if (!input) return 1;
orig_cin = cin.rdbuf(input.rdbuf());
cin.tie(0); // tied to cout by default
}
try {
// normal program using cin
}
catch (...) {
if (orig_cin) cin.rdbuf(orig_cin);
throw;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
尽管在控制离开 main 后使用 cin 的情况极为罕见,但如果您的程序可能会执行此操作,则上述 try-catch 可以避免未定义的行为。