0

我对不寻常的作业有疑问:

不要修改 main 函数,但要更改它作为输出打印的程序:

  • 周一
  • 是第一天
  • 一周中的

这是给定的代码:

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

任何帮助将不胜感激 :)

4

7 回答 7

5

毫无疑问,他对您的演示感兴趣的是一个全局对象(在同一个翻译单元中定义)将在进入 main 之前构建,并在 main 退出后销毁。

请注意,当构建这样一个全局对象时,std::cout可能还不存在(当它被销毁时,std::cout可能不再存在),因此您所做的任何打印都必须通过 C 函数,如printf.

于 2013-01-30T11:21:31.663 回答
1

至少有几种方法可以做到这一点。

  • 您可以替换 的含义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 回答
1

What about this?

#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";
}

Update Ok, you may use name 'cout' in main func like some object not from iostream:

#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

似乎是一个糟糕的家庭作业问题。我看不到在不修改主方法的情况下无法打印其他输出 - 除非您创建了另一个主方法来覆盖它?!提供的代码也是错误的 - 它应该返回 0,因为 main 应该返回一个整数。

于 2013-01-30T11:15:17.713 回答
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 回答
0

我认为您应该为输出流设置一个运算符重载。

于 2013-01-30T11:14:19.377 回答
0

想想进入 main 之前或退出 main 之后发生的事情。

  • 在程序的早期,您通常会进行初始化,最后会进行相应的初始化。
  • 这些东西的 C++ 习语是什么?
  • 你如何让这些发生在 main() 的外部?
  • 您对在命名空间范围内定义的对象了解多少?

如果您了解这些事情,这实际上取决于您在课程中所处的位置。

替代方案: main 中使用的对象仅std::cout当您将该名称带入全局命名空间时。::std 以外的命名空间中的对象也可以使用该名称。

于 2013-01-30T11:15:47.420 回答