在深入浅出MFC中的代码:(为了方便简写了)
class  Doc{
   public:
      CTypedPtrList<CObList,CStroke*>  m_strokeList;
}........ .......
.... ...... ...... ............ ...........
class  View{
...... ........ ........ ..........
   Doc* pdoc=GetDocument();
   CTypedPtrList<CObList,CStroke*> & strokeList=pdoc->m_strokeList;
就是上面这句!是应该返回strokeList还是strokeList的引用?一定要说出为什么!多谢!  还有那个View是怎麽生成的,和Pcontext有什麽关系?请指点!

解决方案 »

  1.   

    CTypedPtrList<CObList,CStroke*> & strokeList=pdoc->m_strokeList
    返回?你的意思是什么?这里没有返回啊?把代码给出来吧
    如果你要以后修改strokeList就返回引用,否则就返回常值引用(这样速度快,只用传地址)
      

  2.   

    我是说在这里:“pdoc->m_strokeList”应该是返回&strokeList还是strokeList?根据什麽原则?
      

  3.   

    pdoc->m_strokeList是成员啊,不是函数,何来返回?
    引用的语法就是:
    type &var1 = var2;
    比如int &a = b;
    如果写成int &a = &b;就错了
    虽然看起来是传值,其实编译器做了特殊处理,其实传的是地址
    语法就是这样,不是什么原则
      

  4.   

    pdoc->m_strokeList是pdoc所指对象的一个成员变量
    这句话声明一个pdoc->m_strokeList的一个引用strokeList,相当于给pdoc->m_strokeList另外起了个名字叫strokeList
    它和下面代码是一样的:
    int i;
    int & nick_name_of_i =i;
    Pcontext在那一页啊?
      

  5.   

    为什麽声明成一个引用?直接:“CTypedPtrList<CObList,CStroke*>  strokeList=pdoc->m_strokeList;”这样写不行吗?
      

  6.   

    引用可以看作一个常指针,空间开销是4个字节
    而你声明一个CTypedPtrList<CObList,CStroke*>  型的变量该有多大了?浪费空间
      

  7.   

    而且以后要对这个strokeList进行操作的话,pdoc中的m_strokeList也应该变是不是
    所以要用引用,当然指针也行
      

  8.   

    原来是出于效率的因素,等于说"CTypedPtrList<CObList,CStroke*>  strokeList=pdoc->m_strokeList;"这样的写法也是对的。就等于“class CStroke : public CObject
    {
    ...
    public:
    UINT m_nPenWidth;
    CDWordArray m_pointArray;
    CRect m_rectBounding; // smallest rect that surrounds all
    // of the points in the stroke
    public:
    CRect& GetBoundingRect() { return m_rectBounding; }  ///////&??
    void FinishStroke();
    ...
    };”这里的“CRect& GetBoundingRect() { return m_rectBounding; }”如果写成“CRect GetBoundingRect() { return m_rectBounding; }”也是对的,等候Tranquillo(影子) 和ATField(field地回答...
      

  9.   

    这样写语法上是没有错误的,这个函数会返回一个rectBounding的副本
    但是函数GetBoundingRect() 的意图是要返回m_rectBounding的地址,便于通过地址对m_rectBounding本身进行操作,你返回一个副本,那么对返回值的操作不能影响到m_rectBounding本声,这样函数就失去了意义