C ++ - 类成员函数中的数组值自发地改变

时间:2014-10-25 20:31:10

标签: c++ arrays class

我在我的多项式类中遇到了一些重载* =运算符的问题。我已经包含了我认为与解决下面问题相关的所有内容。我为代码的长度道歉。

以下是我认为相关的课程标题部分。

#ifndef POL_H
#define POL_H
#include <string>
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

class Pol
{
  // private data members

  string polname;  // polynomial name
  int degree;      // polynomial degree
  int *coef;       // array with polynomial coefficients

 public:

  //  constructors

  Pol(string, int, int*);         // with input name, degree 
                                  // and array of coefficients
  // operator overloading

  Pol operator *= (Pol);

  //  other methods

  void PrintPol ();

这是我的.C文件,重载为* =。我决定不包括PrintPol方法,因为它很长,我几乎100%确定问题不在于它。

#include "Pol.h"

Pol::Pol (string s, int d, int *c)
{
  degree = d;
  polname = s;
  coef = new int [degree + 1];
  coef = c;

  // initializes polynomial of degree d with c coefficients
  // named s
}

Pol Pol::operator *= (Pol p1)
{
  int *cp = this->coef; // If I print the values stored in cp at this point 
                        // everything is alright

  for (int i = p1.degree; i >= 0; --i)
    {
      for (int j = this->degree; j >= 0; --j)
    {
      this->coef[i + j] += p1.coef[i] * cp[j];
      cout << cp[j] << endl; // When I print the values here, they've changed!
    }
    }

  this->degree += p1.degree;

  return *this;
}

我的第一个想法是,也许我超越了数组的界限,但我创建的数组cp的大小是this-&gt; degree,这也是&#34; j&#34;假设,所以我认为不可能。

这是我的主要功能。我怀疑问题出在这里,但无论如何我都把它包括在内,所以你可以看到我是如何使用我所声明的方法的。

#include "Pol.h"
#include <iostream>

using namespace std;

int main ()
{
  int a [9] = {0, 0, 2, 4, 0, 0, 5, 0, 1};
  int b [5] = {4, -2, 0, 0, 1};

  Pol P2 ("P2", 4, b);
  Pol P4 ("P4", 8, a);

  P4*= P2;
  P4.PrintPol();

  return 0;
}

这可能是非常明显的,而且我只是在做自己的屁股,但我已经盯着代码几个小时了,我无法弄清楚。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您问的是*=超载,但问题与*=无关。你说你的数组值正在自发地变化#34;但是你自己在代码中自己更改它们。

int *cp = this->coef; // "If I print the values stored in cp at this point 
                      // everything is alright"

for (int i = p1.degree; i >= 0; --i) {
   for (int j = this->degree; j >= 0; --j) {
      this->coef[i + j] += p1.coef[i] * cp[j]; // <-- Well, you changed them here mate
      cout << cp[j] << endl; // "When I print the values here, they've changed!"
   }
}

从您评论coef声明的方式:

int *coef;       // array with polynomial coefficients

您似乎认为coef是一个数组;不是。您似乎也认为将coef分配给另一个int*会复制它指向的基础数据;它不会。

coef是一个指针,并将其指定给另一个指针只是复制指针。

尝试像其他人一样使用std::vector,以便为您管理数据所有权和生命周期,以便您可以利用基本的分配操作。