飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 1589|回复: 2

[C/C++] 复习之模拟cout<<setw()

[复制链接]

该用户从未签到

发表于 2009-9-20 01:58:08 | 显示全部楼层 |阅读模式
#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;
}
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2009-9-22 18:43:29 | 显示全部楼层
如果我们去实现这样一个输出:cout<<setwidth(4)

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


PS: BS下私藏经验心得且潜水的 这点心得算不了啥 十年后再看这些东西 啥都不是 舍不得分享的东西 最终只是被氧化而已
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-11-16 14:28
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2010-1-23 23:15:13 | 显示全部楼层
    牛人呀!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表