Nisy 发表于 2009-9-20 01:58:08

复习之模拟cout<<setw()

#include "stdafx.h"
#include <iostream>
using namespace std;

typedef void (*PFUN)(ostream& o,int);

class MyCoutSetWidth
{
private:
        PFUN pfun;
        int width;
public:
        MyCoutSetWidth(PFUN fun,int w):pfun(fun),width(w){}
        friend ostream& operator<<(ostream& o,MyCoutSetWidth mycout);
};

ostream& operator<<(ostream& o,MyCoutSetWidth mycout)
{
        mycout.pfun(o,mycout.width);
        return o;
}

void _setwidth(ostream& o,int w)
{
        o.width(w);// 核心在于友元中对设置宽度函数的一个调用
}

MyCoutSetWidth setwidth(int w)
{
        return MyCoutSetWidth(_setwidth,w);
}

int main(int argc, char* argv[])
{
        cout<<setwidth(4)<<12<<endl;
        return 0;
}

Nisy 发表于 2009-9-22 18:43:29

如果我们去实现这样一个输出:cout<<setwidth(4)

首先 setwidth()的返回值 要和 ostream类 重载 <<
而实现返回值和cout的重载 返回值不应该是常类型(整型、浮点型、String) 所以我们返回一个类类型 而返回类类型 就需要在 setwidth() 中创建该类的一个对象 将setwidth() 函数的参数作为该对象的构造函数的参数来传值 此时setwidth()的功能又由谁来实现呢 让该类的重载<<函数来实现 至此思路就有了 于此上面的代码也就水到渠成


PS: BS下私藏经验心得且潜水的 这点心得算不了啥 十年后再看这些东西 啥都不是 舍不得分享的东西 最终只是被氧化而已

evilknight 发表于 2010-1-23 23:15:13

牛人呀!
页: [1]
查看完整版本: 复习之模拟cout<<setw()