基于MFC的程序。大概意思是:我定义了一个类A,然后定义一个数组CArray存放A类对象,假如现在已经添加了2个对象a1,a2,现在想将a1,a2调换顺序,我弄了半天,最后用SetAt()才搞定,帮帮忙看看下面的方法为什么不对。class A
{
   int x,y;   
}
CArray<A,A> *m_array = new CArray<A,A>;
m_array->Add(a1); m_array->Add(a2);////////////////
class temp_swap;
temp_swap = m_array->GetAt(0);
m_array->GetAt(0) = m_array->GetAt(1);
m_array->GetAt(1) = temp_swap;
//结果顺序还是a1,a2。
我在A类里面加了重载操作符=函数,仍然不对:
A& A::operator(A &temp_a)
{
  this->x = temp_a.x;
  this->y = temp_a.y;
  return *this;
}//结果还是原来的顺序最后用SetAt()才搞定,上面的方法错在哪里,是不是指针问题啊?我指针学的不好。请指教,谢谢了。

解决方案 »

  1.   

    楼主不太理解左值和右值得关系可以这么理解:
    m_array->GetAt(0)是返回一个值存在临时变量中,你把临时变量的值又附值了,所以对原来的存储区并没有改变
      

  2.   

    原因是你的m_array里放的是对象,m_array->GetAt(0)只是把位置0的节点复制出来一份,也就是说m_array->GetAt(0)又复制了一份a1,而“m_array->GetAt(0) = m_array->GetAt(1);”只是把复制出来的a1赋值了,而m_array对象中的第0个节点的值并没有改变。如果你真想这么做,可以这么来
    CArray<A*,A*> *m_array = new CArray<A,A>;
    a1=new A; a2=new A;
    m_array->Add(a1); m_array->Add(a2);////////////////
    class temp_swap;
    temp_swap = m_array->GetAt(0);
    m_array->GetAt(0) = m_array->GetAt(1);
    m_array->GetAt(1) = temp_swap;
      

  3.   

    应该是CArray<A*,A*> *m_array = new CArray<A*,A*>;
    我没有调试   就是这么个意思  里面放指针。
      

  4.   

    class A
    {
    public:
    A()
    {
    x = 0;
    y = 0;
    }
    A(int xx, int yy) 
    {
    x = xx;
    y = yy;
    }
    int GetX() const
    {
    return x;
    }
    int GetY() const
    {
    return y;
    }
    private:
    int x;
    int y;
    };
    A a1(10, 10);
    A a2(11, 11); CArray<A,A> *m_array = new CArray<A, A>;
    m_array->Add(a1); m_array->Add(a2); A temp = m_array->GetAt(0);
    m_array->GetAt(0) = m_array->GetAt(1);
    m_array->GetAt(1) = temp; CString str;
    str.Format(_T("%d-%d, %d-%d"), m_array->GetAt(0).GetX(), m_array->GetAt(0).GetY(), m_array->GetAt(1).GetX(), m_array->GetAt(1).GetY());
    AfxMessageBox(str); delete m_array;
    m_array = NULL;
      

  5.   

    谢谢几位了,等于把GetAt理解成函数调用,必须用指针才能改变它本身才行。