免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1591 | 回复: 3
打印 上一主题 下一主题

[C++] [有难度]操作符重载"->"问题,两次调用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-26 20:43 |只看该作者 |倒序浏览
#include <stdio.h>

template<class T>
class CallProxy
{
public:
    CallProxy(T* apT) :
        mpT(apT)
    {
        // nothing to do

    }

    T* operator->() const
    {
        return mpT;
    }
private:
    T* mpT; /// Member pointer of the accessed class

};

template<class T>
class Wrap
{
public:
    explicit Wrap(T& arT) :
        mpT(&arT)
    {
        // nothing to do

    }

   CallProxy<T>    operator->()
    {

        return CallProxy<T>(mpT);
    }
private:
    T* mpT; /// member pointer to the wrapped class

};

template<class T>
class Shared : public Wrap<T>
{
public:
    explicit Shared(T& arT) :
        Wrap<T>(arT)
    {
        // nothing to do

    }
};

class BcmRegistry
{
public:
    void show()
    {
        printf("test....\n");
    }
};

Shared<BcmRegistry>& theConfig()
{
    static BcmRegistry theRegistry;
    static Shared<BcmRegistry> threadSafe(theRegistry);

    return threadSafe;
}

void main()
{
    theConfig()->show();
}

   虽然知道了结果,但过程中,在单步调试时,调用了两次重载的"->",这让我不理解.
请指点下. 谢谢

论坛徽章:
0
2 [报告]
发表于 2009-06-27 06:46 |只看该作者
第一次是初始化你那个共享空间,第二次是运行函数

所以会调用两次重载的"->",

论坛徽章:
0
3 [报告]
发表于 2009-06-29 15:09 |只看该作者

回复 #2 aaaaa5aa 的帖子

从我单步调试结果来说,我也知道是这样...
从结果推断出来了, 但并没有理解, 不知道有没有资料上介绍了这个.

另外:
      theConfig()->show();和
    theConfig().operator ->()->show();和
    theConfig().operator ->().operator ->()->show();
具有相同效果. 第三种方式很让人明白. 估计这只是直接调用成员函数,而不算是重载?
而且operator不能去掉.

    另外,我将theConfig()函数的返回值改成指针类型,那么只有
        theConfig()->operator ->()->show();和
        theConfig()->operator ->().operator ->()->show();
    两种可行.

   由此,我认为, 在->运算时: 先判断->左边值的类型 是否有重载的->,若有则调用, 并将返回值放在->的左侧,并继续先前步骤, 直到没有了重载的, 就执行正常的->运算.

请指点.

论坛徽章:
0
4 [报告]
发表于 2009-06-29 16:42 |只看该作者
我相你下你返回的是对象怎么可以通过->这个来访问成员函数啊真想不明白啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP