不要修改程序,打印一些值作为输出 - 异常(?)作业

时间:2013-01-30 11:09:17

标签: c++

我有一个问题,对我来说,不寻常的功课:

  

不要修改主要功能,而是将其打印的程序更改为   输出:

     
      
  • 星期一
  •   
  • 是第一天
  •   
  • 本周
  •   

以下是给定的代码:

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

任何帮助将不胜感激:)

7 个答案:

答案 0 :(得分:5)

他对你的演示无疑感兴趣的是,在输入主要内容之前将构建一个全局对象(在同一翻译单元中定义),并在主要退出之后销毁。

请注意,在构建此类全局对象时,std::cout可能尚不存在(当它被销毁时,std::cout可能不再存在),因此您执行的任何打印都有通过像printf这样的C函数。

答案 1 :(得分:1)

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

答案 2 :(得分: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";
}

<强>更新 好的,你可以在主要功能中使用名称'cout',就像某些对象不是来自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";
}

答案 3 :(得分: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";
}

答案 4 :(得分: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";
}

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

如果您了解这些事情,那真的取决于您在课程中的位置。

备用:如果您将该名称带入全局命名空间,则main中使用的对象仅为std::cout。除了:: std之外的名称空间中的对象也可以使用该名称。