类和运算符

Classes and operators

本文关键字:运算符      更新时间:2023-10-16

我正在学习用c++编写代码,并且在运算符方面遇到了问题。我创建了这个类:

typedef float data_type;
class eucVector
{
  public:
    unsigned int dim;
    data_type *vdata;
    eucVector();
    eucVector(unsigned int);
    eucVector(unsigned int, data_type*);
    ~eucVector();
    void print();
    eucVector operator + (eucVector);
};

这个类基本上是一个欧几里得向量,大小可变(dim),运算符+只需添加所涉及向量的每个条目。

这就是该运营商的实现:

eucVector eucVector::operator + (eucVector y)
{
  eucVector c(dim);
  for (unsigned int i=0; i<dim; i++)
  {
    c.vdata[i] = vdata[i] + y.vdata[i];
  }
  return c;
}

现在,主要功能如下:

int main()
{
  eucVector a(3), b(3), c;
  for (int i=0; i<3; i++)
  {
    a.vdata[i] = 3*i-1;
    b.vdata[i] = 2*i +3;
  }
  cout << "a = ";
  a.print();
  cout << "b = ";
  b.print();
  cout << endl;
  c = a+b;
  cout << "a = ";
  a.print();
  cout << "b = ";
  b.print();
  cout << endl << "c = ";
  c.print();
  return 0;
}

结果是一个充满了零的向量c,更重要的是,向量b没有命令改变它,它在"c=a+b;"行之后改变了它的两个第一个条目。

我不知道发生了什么,从昨天开始我就在处理这个问题。不能让这么简单的函数工作有点令人沮丧。。。请帮帮我!

非常感谢。

附言:我不知道这是否重要,但我使用Code::Blocks作为我的IDE,我在一台装有Windows8的电脑上。

这是其他功能:

eucVector::eucVector()
{
  dim = 0;
  vdata = NULL;
}
eucVector::eucVector(unsigned int newDim)
{
  dim = newDim;
  vdata = (data_type *)calloc(dim, sizeof(data_type));
}
eucVector::eucVector(unsigned int newDim, data_type* newdata)
{
  dim = newDim;
  vdata = (data_type *)calloc(dim, sizeof(data_type));
  for(unsigned int i=0; i<dim; i++)
  {
    vdata[i] = newdata[i];
  }
}
eucVector::~eucVector()
{
  free(vdata);
}
void eucVector::print()
{
  for (int i=0; i<dim-1; i++)
   cout << vdata[i] << ", ";

  cout << vdata[dim-1] << endl;
}

我怀疑这是三条规则让你上当。

由于您没有定义复制构造函数,并且经常按值将对象传入函数和传出函数,因此C++将以一种简单的方式复制对象,其中副本共享同一指针成员。但是,如果其中一个副本被销毁,它会调用您的析构函数,并且内存会被释放,即使它正被另一个eucVector使用。