0

我正在学习用 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;”之后改变了它的2个第一个条目。线。

我不知道发生了什么,我从昨天开始就在处理这个问题。无法让如此简单的功能正常工作有点令人沮丧......请帮助我!

非常感谢。

PS:我不知道这是否重要,但我使用 Code::Blocks 作为我的 IDE,并且我在一台装有 Windows 8 的电脑上。

这是其他功能:

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;
}
4

1 回答 1

3

我怀疑这是三法则让你。

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

于 2013-06-27T23:54:04.777 回答