0

私には、珍しい宿題に問題があります。

main関数を変更せずに、出力として出力するプログラムを変更します。

  • 月曜日
  • 初日です
  • その週の

そしてここに与えられたコードがあります:

int main()
{
  cout << "is the first day\n";
}

どんな助けでもありがたいです:)

4

7 に答える 7

5

彼があなたのデモンストレーションに間違いなく興味を持っているのは、グローバルオブジェクト(同じ翻訳単位で定義されている)がメインに入る前に構築され、メインが出る後に破棄されるという事実です。

このようなグローバルオブジェクトが構築されているときは、std::coutまだ存在していない可能性があることに注意してください(また、破棄されているときstd::coutは、もはや存在しない可能性があります)。したがって、印刷は、のようなC関数を介して行う必要がありますprintf

于 2013-01-30T11:21:31.663 に答える
1

宿題の質問が悪いようです。これをオーバーライドする別のメインメソッドを作成しない限り、メインメソッドを変更せずに他の出力を出力する方法はわかりません。提供するコードも間違っています。mainは整数を返すことが期待されているため、0を返す必要があります。

于 2013-01-30T11:15:17.713 に答える
1

これはどうですか?

#include <iostream>
#include <cstdlib>

using namespace std;

struct Foo
{
    Foo()
    {
        cout << "Monday\nis the first day\nof the week\n";
        exit(0);
    }
} X;

int main()
{
    cout << "is the first day\n";
}

更新 OK、iostream以外のオブジェクトのように、メイン関数で「cout」という名前を使用できます。

#include <iostream>
#include <string>

class Foo
{
    public:
        void operator <<( const std::string & s )
        {
            std::cout << "Monday\n" << s << "of the week";
        }
} cout;

int main()
{
    cout << "is the first day\n";
}
于 2013-01-30T11:18:56.363 に答える
1

それの楽しみのためだけに、もう一つの凶悪な考え:

#include <iostream>

using namespace std;

#define main real_main
int main()
{
    cout << "is the first day\n";
}
#undef main

int main()
{
    cout << "Monday\n";
    int res = real_main();
    cout << "of the week\n";
    return res;
}

プリプロセッサfooに依存しない別のバージョンは、グローバル静的オブジェクトの構築と破棄を使用することです。std::coutどうやら標準はすべてのユーザーコードの前後に(そして友達が)初期化され破壊されることを保証しているので、これは安全です:

#include <iostream>
using namespace std;

struct Homework
{
    Homework()
    {
        cout << "Monday\n";
    }
    ~Homework()
    {
        cout << "of the week\n";
    }
} hw;

int main()
{
    cout << "is the first day\n";
}
于 2013-01-30T11:36:47.740 に答える
1

これを行うには、少なくとも2つの方法があります。

  • の意味を置き換えることができますcout
  • main呼び出される前後に物事を起こさせることができます。

再定義cout

#include <iostream>

class MyCout {};

void operator<<(MyCout& myCout, const char* message) {
    std::cout << "Monday\n";
    std::cout << message;
    std::cout << "of the week\n";
}

MyCout cout;

int main()
{
    cout << "is the first day\n";
}

mainの前後で物事を起こさせるために、静的オブジェクトを作成できます。それらのコンストラクタはmainの前に呼び出され、デストラクタは後で呼び出されます。

#include <iostream>

class PrintExtras {
public:
    PrintExtras() {
        std::cout << "Monday\n";
    }
    ~PrintExtras() {
        std::cout << "of the week\n";
    }
};

PrintExtras printExtras;

using std::cout;

int main()
{
    cout << "is the first day\n";
}
于 2013-01-30T11:58:23.133 に答える
0

メインに入る前またはメインから出た後に起こることを考えてください。

  • プログラムの初期には通常、初期化があり、最後には対応するものがあります。
  • それらのC++イディオムは何ですか?
  • main()の本体の外でそれらをどのように発生させることができますか?
  • 名前空間スコープで定義されたオブジェクトについて何を知っていますか?

あなたがこれらのことを知っているならば、それはあなたがあなたのコースでどこにいるかに本当に依存します。

代替:mainで使用されるオブジェクトは、std::coutその名前をグローバル名前空間に取り込む場合のみです。::std以外の名前空間内のオブジェクトにもその名前を付けることができます。

于 2013-01-30T11:15:47.420 に答える
0

出力ストリームに対して演算子をオーバーロードする必要があると思います。

于 2013-01-30T11:14:19.377 に答える