为什么这段代码会产生错误?

时间:2014-03-20 22:24:11

标签: c++ overloading operator-keyword

我有一个包含另一个名为Sphere的类的数组的类。现在我不确定为什么代码的一部分会产生错误。

.H文件

sphere* list;
int listlen;
void add(sphere x);
sarray operator +(const sarray& arrayone);

.CPP

sarray::sarray()
{
listlen = 0;
list = new sphere[200000];
}

sarray::~sarray()
{
delete [] this->list;
}

void sarray::add(sphere x) // Function for adding spheres to the list.
{
    listlen++;
list[listlen-1] = x; 
}   

void sarray::operator = (const sarray& arrayone)
{
  this -> list = NULL;
  for(int i = 0; i < arrayone.listlen; i++)
  {
      this -> add(arrayone.list[i]);
  }
}

sarray sarray::operator +(const sarray& arrayone)
{
sarray temparray;

for(int i = 0; i < arrayone.listlen; i++) // add all the elements from the first array to the temporary one
{
    //sphere temp = arrayone.list[i];
    temparray.add(arrayone.list[i]);
}

for(int j = 0; j < this -> listlen; j++)// add all the elements from the second array to the temporary one
{
    temparray.add(list[j]);
}

return temparray;
}

sphere类有一个名为“Radius”的成员变量 当我尝试比较像这样

float a = 10;
for(int i=0; i > this->listlen;i++)
  if(this->list[i].Radius > a) //<-- Can read the values

工作正常,但在更改代码的这一部分时

float a = 10;
sarray temparray = arrayone + *this;
for(int i = 0; i < temparray.listlen; i++)
  if(temparray.list[i].radius > a) // Error comes here!

"Unhandled exception at 0x00138503: Access violation reading location"

虽然这样做了。我想问题出在Add / operator函数中,但我找不到它。

2 个答案:

答案 0 :(得分:2)

以下部分看起来有问题:

void sarray::add(sphere x) // Function for adding spheres to the list.
{
list[listlen-1] = x; 
} 

你应该喜欢这样的东西

void sarray::add(sphere x) // Function for adding spheres to the list.
{
list[listlen++] = x; 
} 

另外,您最好在添加方法中进行一些错误检查。

答案 1 :(得分:1)

好的,看过析构函数,你在sarray中有一个指向sphere的指针,并有一个析构函数来销毁指针。除非您没有定义自己的复制构造函数,这意味着使用了默认的复制构造函数,否则这一切都很好。在返回temparray的函数operator +中,返回本地副本的副本。调用默认的复制构造函数来创建副本。然后当地人将被毁坏。现在,返回的sarray副本列表将指向无效数据。您需要定义自己的复制构造函数以制作列表指针的深层副本。