Я разрушаю свой мозг, пытаясь понять это. Пожалуйста, терпите меня, потому что я только на моей четвертой неделе изучаю 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;
}
Ваш исходный код объединяет много в одной строке. Я разбиваю это на части для объяснения:
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
еще раз — вот почему вы можете связать утверждения вместе.
Зная это, теперь вы сможете понять, почему это не удается:
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
можете распечатать свои данные напрямую и вернуть 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 ++!
выражение cout << stuff
имеет cout
в качестве возвращаемого значения, поэтому вам нужно сделать то же самое в вашей функции:
std::ostream& recomposedEncryptedNumber()
{
return cout << setfill('0') << setw(1) << hundreds << setw(1) << tens << setw(1) << units;
}
Вы объявили свой прототип перед основным? например. У меня нет больше времени, чтобы объяснить, но вот как вы это сделаете
#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;
}`
cout
печать на стандартном выводе, вы пытаетесь смешать 2 типа, и поэтому он не работает.
Попытайся :
std::string recomposedEncryptedNumber()
{
std::string str;
concat(str,setfill('0'));
concat(str,setw(1));
...
return str;
}
Что ж,
вот как я бы реализовал то, что я думаю, вам нужно:
#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);
}
Конечно, это быстрое решение, и я не создал методы получения / установки, не отделил концепцию от реализации и ничего полезного внутри EncryptedNumber.
Дело в том, что код будет выглядеть намного элегантнее и удобнее в использовании.
Пожалуйста, скажите мне, если вы хотите более подробное объяснение.