0

我正在破坏我的大脑试图弄清楚这一点。请多多包涵,因为我才刚开始学习 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;
}
4

5 回答 5

2

该表达式cout << stuff具有cout作为返回值,因此您需要在函数中执行相同的操作:

std::ostream& recomposedEncryptedNumber()
{    
   return cout << setfill('0') << setw(1) << hundreds << setw(1) << tens << setw(1) << units;
}
于 2013-10-30T17:32:27.230 回答
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;
       }`
于 2013-10-30T17:43:08.113 回答
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再次 - 这就是您可以将语句链接在一起的原因。

知道了这一点,您现在应该能够看到失败的原因:

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++!

于 2013-10-30T17:59:14.613 回答
0

cout在标准输出上打印,您正在尝试混合两种类型,这就是它不起作用的原因。

尝试一下 :

std::string recomposedEncryptedNumber()
{    
    std::string str;
    concat(str,setfill('0'));
    concat(str,setw(1));
    ...
    return str;
}
于 2013-10-30T17:31:31.580 回答
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 中没有任何用处。关键是这样代码看起来会更加优雅和可维护。

如果您需要更详细的解释,请告诉我。

于 2013-10-30T18:14:33.940 回答