首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何改变endl的作用结果 [已结帖,结帖人:xiao_dang]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiao_dang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-11-09 16:00:15 楼主
    写了一个类,继承自ostringstream。

    现在我希望这个类对一般的 < <操作功能不改变,只改变对endl的操作结果,请问代码应如何写?
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lzr4304061988012
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 16:09:421楼 得分:10
    C/C++ code
    #include <iostream> #include <sstream> #include <string> using std::cout; using std::ostream; //endl是操作算子,LZ可以定义自己的endl覆盖std中的; ostream & endl(ostream & os) { cout<<"my endl\n"; return os; }//在这里面干自己想干的事 void main() { cout<<"test :"<<endl; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 16:12:002楼 得分:0
    up~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lzr4304061988012
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 16:21:003楼 得分:0
    C/C++ code
    cout<<"test :"<<endl; /*一般操纵算子,内部应该是这样实现的: ostream & ostream::operator<<(ostream &(*pf)(ostream & os) { return (*pf)(*this); } 所以endl其实是个函数指针*/
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • backway
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 16:23:194楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lzp765
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 16:26:315楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zmlovelx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 16:36:226楼 得分:0
    up 1楼
    楼主可以把这个自定义endl封装到自定义的类中
    这样就可达到你的目的了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiao_dang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 17:36:417楼 得分:0
    原来的endl是一个全局函数啊,除了显示声明名字空间(或作用域)之外有别的办法吗?如果没有我就结贴了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • arong1234
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 18:19:148楼 得分:20
    endl是通过operator < <传给stream的,你重载operator < <,然后判断指针是否等于endl就可以了
    替换全局函数实际上是不好的方法,因为你设计这个类的目的无非是不想改已经有的代码,如果需要修改endl,估计你有一堆代码需要修改,就没有啥意义了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yy405145590
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 18:34:459楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • grellen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 18:38:5110楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • giftfish
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 20:41:1611楼 得分:0
    up!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiao_dang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 22:13:5512楼 得分:0
    我最早也是这样想的,但是程序总是无法通过编译。我觉得有两个困难:
    1.endl是模板函数,而且有几个重载的版本,我不知道C++是否支持这样的函数指针比较。
    2.operator < <不是虚函数,如果我写 myclass < <1 < <endl,那么myclass < <1会返回基类型,从而 < <endl不会得到想要的结果。

    如果你写出了能正确运行的代码,请贴出来。谢谢!

    引用 8 楼 arong1234 的回复:
    endl是通过operator < <传给stream的,你重载operator < <,然后判断指针是否等于endl就可以了
    替换全局函数实际上是不好的方法,因为你设计这个类的目的无非是不想改已经有的代码,如果需要修改endl,估计你有一堆代码需要修改,就没有啥意义了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tienchiu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 22:22:2413楼 得分:0
    没想过这个问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiao_dang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 23:43:1814楼 得分:0
    up~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lucky_06
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 23:53:1915楼 得分:0
    C/C++ code
    #define endl "hello \r\n" int main(int argc , char* arcv[]) { cout<<endl; system("pause"); return EXIT_SUCCESS; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-09 23:57:4416楼 得分:0
    引用 15 楼 lucky_06 的回复:
    C/C++ code

    #define endl "hello \r\n"


    int main(int argc , char* arcv[])
    {


        cout < <endl;
        system("pause");
        return EXIT_SUCCESS;
    }


    汗一个~~~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lucky_06
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 00:03:4617楼 得分:0
    引用 16 楼 hqin6 的回复:
    引用 15 楼 lucky_06 的回复:
    C/C++ code

    #define endl "hello \r\n"


    int main(int argc , char* arcv[])
    {


        cout < <endl;
        system("pause");
        return EXIT_SUCCESS;
    }


    汗一个~~~~~



    条条大路通罗马嘛……

    也一个思考的方向大家啦~~~~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lann64
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 01:58:2718楼 得分:0
    从ostringstream类继承?你确保这样没有副作用?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiao_dang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 12:07:3219楼 得分:0
    你指的是哪方面的副作用?
    我确保我只需要一个这样的全局对象。

    引用 18 楼 lann64 的回复:
    从ostringstream类继承?你确保这样没有副作用?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lann64
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 13:43:4320楼 得分:50
    我不清楚ostringstream类是否属于TC++PL说的“具体类型”,但显然它不是按照基类方式进行封装的,不是按照虚函数方式提供接口,再加上涉及buffer管理,是否可以方便实现继承?
    为什么不考虑采用封装呢?
    引用 19 楼 xiao_dang 的回复:
    你指的是哪方面的副作用?
    我确保我只需要一个这样的全局对象。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Longinc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 13:48:1321楼 得分:0
    UP
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • taodm
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      3

    发表于:2008-11-10 14:02:2822楼 得分:0
    楼主啊,endl对stringstream到底起什么功能,你先搞清楚了没有?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xxgamexx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 14:16:3023楼 得分:0
    引用 22 楼 taodm 的回复:
    楼主啊,endl对stringstream到底起什么功能,你先搞清楚了没有?


    我也想知道!

    MARK!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cyj626
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 14:24:2124楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zwd2005
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 14:34:5525楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jia_xiaoxin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 14:44:4526楼 得分:20
    endl是一个ostream操纵符(manipulator),它把一个换行符插入到输出流中,然后刷新ostream缓冲区。
    endl的使用方法除了cout < < endl;
    还用 endl(cout);
    因为它是一个操作符,所以你要修改它,就必须重载endl操作符。

    C/C++ code
    class xstream : public ostringstream { public: // Constructors, etc. // ........ inline xstream& endl( xstream & ) { xstream << "Hello!"; return (xstream&)ostream::endl(xstream); } // ........ // Insertions for other types };



    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiao_dang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-10 18:27:3327楼 得分:0
    是这样的,我想保留ostringstream的全部功能,但是我希望在每次调用endl的时候执行一次更新的操作。
    封装的话工作量太大了,当然如果没有别的办法也不得不采用。

    引用 20 楼 lann64 的回复:
    我不清楚ostringstream类是否属于TC++PL说的“具体类型”,但显然它不是按照基类方式进行封装的,不是按照虚函数方式提供接口,再加上涉及buffer管理,是否可以方便实现继承?
    为什么不考虑采用封装呢?
    引用 19 楼 xiao_dang 的回复:
    你指的是哪方面的副作用?
    我确保我只需要一个这样的全局对象。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xxgamexx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-11 14:04:3128楼 得分:0
    引用 26 楼 jia_xiaoxin 的回复:
    endl是一个ostream操纵符(manipulator),它把一个换行符插入到输出流中,然后刷新ostream缓冲区。
    endl的使用方法除了cout < < endl;
    还用 endl(cout);
    因为它是一个操作符,所以你要修改它,就必须重载endl操作符。


    C/C++ codeclass xstream : public ostringstream
    {
    public:
        // Constructors, etc.
        // ........
        inline xstream& endl( xstream & )
        {
              xstream < < "Hello!";
      …


    这个应该不错

    做完自己的操作后 调用父类的 endl操作
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • CTZL20088
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-11 23:11:3629楼 得分:0
    顶一下
    修改 删除 举报 引用