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

C++ 不要修改程序,打印一些值作为输出-异常(?)作业,c++,C++,对我来说,我对不寻常的家庭作业有一个问题: 不要修改主功能,而是更改它打印为的程序 输出: 星期一 是第一天吗 本周最佳 下面是给定的代码: int main() { cout << "is the first day\n"; } intmain() { cout我认为您应该为输出流设置一个运算符重载。似乎是一个糟糕的家庭作业问题。我无法在不修改main方法的情况下打印其他输出-除非您创建另一个main方法来覆盖它?!提供的代码也是错误的-它应该返回0,因为main应该返回

对我来说,我对不寻常的家庭作业有一个问题:

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

  • 星期一
  • 是第一天吗
  • 本周最佳
下面是给定的代码:

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

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

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

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

  • 在一个程序的早期,你通常有初始化,最后是它的对应物
  • 对于这些东西,C++习语是什么?
  • 如何使这些发生在main()的主体之外
  • 您对在命名空间范围内定义的对象了解多少
这真的取决于你的课程在哪里,如果你知道这些事情的话

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

这是怎么回事

#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";
}
#包括
#包括
使用名称空间std;
结构Foo
{
Foo()
{

cout毫无疑问,他对你的演示感兴趣的是这样一个事实:一个全局对象(在同一个翻译单元中定义)将在main进入之前构造,并在main退出之后销毁


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

另一个糟糕的想法,只是为了好玩:

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

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

  • 您可以替换
    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";
}
#包括
类MyCout{};

void operator请记住,您不必从shell或窗口环境运行程序,您可以从另一个程序启动程序。我建议您回到设置这项工作的人那里,让他们澄清他们的意思。我认为这样做的唯一方法是做一些完全邪恶的事情,如
#define
cout to mean其他的东西。@ JoachimPileborg:是的,我知道,但不是这样。命令是为了使程序变得模糊不清,除了这主要是鼓励糟糕的编码风格。还有一些解决方案并不是那么糟糕。它提出了一些可能有趣的问题,关于程序初始化和终止或关于名称空间。在C++中,如果<代码>主< <代码>不存在。“我不返回任何东西,然后编译器在最后添加一个隐式的
返回0
。@Konrad:我也知道,但我的老师让我“严格按照他说的那样”去做”:/sorry-c和java中提到了更多内容,所以忘记了隐式返回。如果这是
::std::cout
,您不能重新重载operatortricky,但恐怕不是这样。为什么不是呢?它完全符合要求…@yak不是吗?您的问题没有正确答案。您心里有答案吗?那是什么(关于cout的部分未初始化)“不知道”。阅读关于代码>类STD::inIsbas::init < /C> >它是如何通过<代码> <代码>标头> @ Jealb:它依赖于编译器和C++版本。它支持C++ C++ 11,它应该工作。C++ 03有一个非规范的注脚来表达它应该工作的意图,但据我所知,没有人会这样做。有没有发现过标准化语言可以作为真正的需求来支持这一点(有些真正的编译器不起作用)。如果您需要更多详细信息,请参阅C++03,§27.3/2和脚注265。我就是这样,非常感谢您的帮助:)
#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";
}
#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";
}
#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";
}