我正在破坏我的大脑试图弄清楚这一点。请耐心等待,因为我只是在第四周学习C ++。
当将所有代码放在main()
中时,下面的代码工作正常int main()
{
cout << setfill('0') << setw(1) << hundreds << setw(1) << tens
<< setw(1) << units << "\n";
system("PAUSE");
return 0;
}
但是我被要求让它工作以便代码被拆分,但我似乎无法做到。我的尝试如下。如果有人能把我送上正确的轨道,那就太好了。请记住,我们没有学到任何复杂的东西,所以它应该不难。
int main()
{
cout << "The encrypted number is: " << recomposedEncryptedNumber() << "\n";
system("PAUSE");
return (0);
}
int recomposedEncryptedNumber()
{
return setfill('0') << setw(1) << hundreds << setw(1) << tens << setw(1) << units;
}
答案 0 :(得分:2)
表达式cout << stuff
有cout
作为返回值,因此您需要在函数中执行相同的操作:
std::ostream& recomposedEncryptedNumber()
{
return cout << setfill('0') << setw(1) << hundreds << setw(1) << tens << setw(1) << units;
}
答案 1 :(得分:1)
您是否在main之前声明了原型?例如。我没有更多时间来解释,但这是你将如何做到这一点
#include <iostream>
#include <iomanip>
using namespace std;
void recomposedEncryptedNumber(int hun, int tens, int units);
int main()
{
int hun = 1;
int tens = 1;
int units = 1;
cout << "The encrypted number is: " << "\n";
recomposedEncryptedNumber(hun,tens,units);
system("PAUSE");
return (0);
}
void recomposedEncryptedNumber(int hun, int tens, int units)
{
cout << setfill('0') << setw(1) << hun << setw(1) << tens << setw(1) << units;
}`
答案 2 :(得分:1)
您的初始代码在一行中结合了很多。我把它拆开了解释:
int main()
{
cout // cout is "console output" -- i.e. how you print to the screen
<< setfill('0') // This is the operation "cout << setfill('0')"
// which creates a modifier "setfill", passes it to cout,
// and now you've "taught" cout to use '0' as the fill
// character.
// Importantly, "cout << setfill('0')" returns cout...
<< setw(1) // This is the operation "cout << setw(1)".
// It's applying the "<< setw(1)" to the return of the
// previous command. This is also a special modifier,
// and again, this returns 'cout'.
<< hundreds // Now you're finally printing something, because this
// is doing "cout << hundreds"
<< setw(1)
<< tens
<< setw(1)
<< units
<< "\n";
system("PAUSE");
return 0;
}
重要的是,该长行中的每个操作都是cout << {something}
,<<
操作的结果再次是cout
- 这就是为什么你可以将这些语句链接在一起。< / p>
知道了,你现在应该能够看到为什么失败了:
int recomposedEncryptedNumber()
{
return
setfill('0') // This gives you the setfill modifier.
// -- but that's _not_ cout.
<< setw(1) // "setfill << setw"?? Not what you want at all.
// You want "cout << setfill" and "cout << setw".
<< hundreds << setw(1) << tens << setw(1) << units;
}
您有很多选项可供选择。你可以这样做:
int main() {
cout << "The encrypted number is: ";
printRecomposedEncryptedNumber();
cout << "\n";
}
这是三个单独的陈述。现在printRecomposedEncryptedNumber
可以直接将您的详细信息打印到cout,并返回void(即不返回任何内容)。
如果你想内联:
int main() {
cout << "The encrypted number is: " << recomposedEncryptedNumber() << "\n";
}
然后,您的recomposedEncryptedNumber
必须返回可以提供给cout
的内容。因为你正在尝试做一些特殊的格式化,所以你不想使用int - cout只会以它想要的方式显示int。所以你应该使用一个字符串。然后你的函数可以做任何想要的格式化,并返回格式正确的字符串:
string recomposedEncryptedNumber(int hundreds, int tens, int units)
{
std::ostringstream msg; // 'o' is for output
// 'string' is because we're building a string
// 'stream' is because this uses streaming methods
// i.e. 'ostringstream' lets us build a string,
// by using streaming mechanisms.
// Same stream machinations you were doing before, just with 'msg'
// instead of 'cout'
msg << setfill('0') << setw(1) << hundreds << setw(1) << tens << setw(1) << units;
return msg.str(); // return the string we've built.
}
最后,为了让您的函数能够访问hundreds
,tens
,units
,必须为函数提供这些变量(即变量必须传入函数作为参数)。
欢迎使用C ++!
答案 3 :(得分:0)
cout
在标准输出上打印,你试图混合使用2种类型,这就是为什么它不起作用。
试一试:
std::string recomposedEncryptedNumber()
{
std::string str;
concat(str,setfill('0'));
concat(str,setw(1));
...
return str;
}
答案 4 :(得分:0)
那么,
这就是我如何实现我认为你需要的东西:
#include <iostream>
#include <iomanip>
using namespace std;
class EncryptedNumber
{
public:
EncryptedNumber( unsigned h, unsigned t, unsigned u )
: hundreds( h ),
tens( t ),
units( u )
{}
protected:
unsigned hundreds,
tens,
units;
friend std::ostream & operator << ( std::ostream& outs, const EncryptedNumber& en );
};
std::ostream & operator << ( std::ostream& outs, const EncryptedNumber& en )
{
outs << setfill( '0' ) << setw( 1 ) << en.hundreds
<< setw( 1 ) << en.tens
<< setw( 1 ) << en.units;
return outs;
}
int main()
{
EncryptedNumber en( 1, 2, 3 );
cout << "The encrypted number is: " << en << "\n";
system("PAUSE");
return (0);
}
当然这是一个快速的解决方案,我没有创建getter / setter方法,没有从实现中分离概念,并且在EncryptedNumber中没有任何用处。 关键是代码看起来会更加优雅和可持续发展。
如果您想要更详细的解释,请告诉我。