潘安民com原理与应用聚合哪一张的例子没有看明白 106页倒数7行,
   书上所说所得到的是非委托的IUnKnown接口的指针,再通过这个指针去查找
ISomeInterface接口,这里我有两点没有看明白,   1.非委托接口INondelegatingUnknown 没有queryInterface(....)的定义,
只有委托接口定义了,我想如果要使用queryInterface(...)是不是在接口指针处转换一下就如  (IUnKnown *)pnodelegnt->queryInterface(.......);
  2.如果书上代码是正确的,因为书上所实现queryInterface()的是委托接口,
queryInterface(..)的实现是判断是不是聚合,如是不是就交给非委托的接口查询
函数,否则是则根据聚合原理丢给外面的接口对象的queryInterface(..)处理,
但看书上代码外面接口对象的queryInterface(...)实际上是丢给Init时所产业的聚合对象的queryInterface(..)去处理,就是说,绕了个圈子又回到最先qureryInterface(..)的地方了,我想应该是我哪理解有问题,请指点一二

解决方案 »

  1.   

    聚合的时候,内部对象在外部看来也只有一个IUnknown,你和平常一样调用就可以了!
    不过就是内部的实现分了委托和非委托两个东西而已。
      

  2.   

    哈哈,又有一个在这里卡了,说明你们没有仔细看!!!
    你这样理解,INondelegatingUnknown是给聚合对象调用的,而IUnknown是给客户调用的!!!被聚合的对象把客户对IUnknown调用转发给聚合对象
      

  3.   

    1.客户不能得到NonDelegatingIUnknown的指针,所有的查询都是经过委托IUnknown实现
    2.外部对象含有一个指向内部NonDelegatingIUnknown的指针,调用m_pInnerUnknown的QueryInterface就是调用NonDelegatingIUnknown的NonDelegatingQueryInterface,因为两个IUnknown的内存结构是一样的,非代理的转成一般的,所以QI也转了
      

  4.   

    我觉得这个实现好像和Don Box的不太一样。
      

  5.   

    luohualiushui(落花流水) 你的意思是NonDelegatinIUnknown定义时结构必须与IUnKnown的结构一模一样,NonDelegatinAddef()先,执着NonDelegationRelease(),然后是非委托的QueryInterface()是不是,如是这样的要委托QueryInterface()内的判断非委托与委托的语句有什么用了,还是不是太明白
         QeuryInterface(Isome,**p)
          {              if(pOUt)    //是聚合
                      pOut->QueryInterface(iSome,**p)   //给到外面处理
                                                        //但外面处理isome这个接口
                                                       //实际上又交给外部包含的内部
                                                       //聚合对象的QueryInterface()处
                                                       //理,就又到这里面来了,         else
                   NonDelegatinQuerry(iSome,**p);
    }
      

  6.   

    判断是不是委托当然有用
    if(pOUt)    //是聚合
                      pOut->QueryInterface(iSome,**p)   \\在这里是传给m_pOurUnknown(被聚合类的成员),也就是外面的IUnknown,如果还是请求被聚合的接口,那么再传给m_pInnerUnknown(聚合类的成员,即指向被聚合类的NonDelegatingUnknonw)
      

  7.   

    并不是直接传给m_pInnerUnknown
    好好理解一下
      

  8.   

    sorry,几天没有来了,你说的和我说的是一样的,并不是直接传给m_pInnterUnknown
    ,我是说外面的IUnKnown中的QuerryInterface()是这么写的
       
        QueryInterface()
    {
    。。
    。 
       if(riid==ISome)
            m_pInnerUnknown->QueryfaceInterface(...)//这一句不是又到了上面哪个QueryInterface()中去了嘛,不就成了循球,在里面的QueryInterface一看是聚合就传出来,外面一看是riid是ISome又传进去 ,所以说我还是没有明白,呵呵,你在讲一遍吧
    。}
      

  9.   

    我上面已经讲的很清楚了
    m_pInnerUnknown是指向NonDelegatingUnknown的,不是指向IUnknown
    所以它调用QueryInterface其实是调用NonDelegatingQueryInterface
    如果还不明白就把书看两遍,希望熟能生巧吧