读书人

CArray对象数组有关问题请问一上

发布时间: 2013-01-23 10:44:49 作者: rapoo

CArray对象数组问题,请教一下。
基于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()才搞定,上面的方法错在哪里,是不是指针问题啊?我指针学的不好。请指教,谢谢了。


[解决办法]
楼主不太理解左值和右值得关系

可以这么理解:
m_array->GetAt(0)是返回一个值存在临时变量中,你把临时变量的值又附值了,所以对原来的存储区并没有改变
[解决办法]
原因是你的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;

[解决办法]

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;

读书人网 >VC/MFC

热点推荐