2013-10-23 29 views
2

所以我嘗試創建一個Integer類的數組時遇到了錯誤。 Integer * arr = new Integer [3];這不起作用,我不明白爲什麼。在底部的main()函數中查看我擁有這行代碼的位置。創建一個類的數組

using namespace std; 

class Integer 
{ 
    unsigned int * data; 
    bool positive; 
    int length; 
    static const long long BASE = (long long)UINT_MAX + 1; 
    void copy(const Integer & from) 
    { 
     int trim = 0; 
     for(int i = 0; i < from.length; i++) 
     { 
      if(from.data[i] == 0) 
       trim++; 
      else 
       break; 
     } 
     length = from.length - trim; 
     if(length == 0) 
     { 
      length = 1; 
      data = new unsigned int[length]; 
      data[0] = 0; 
     } 
     else 
     { 
      data = new unsigned int[from.length]; 
      positive = from.positive; 
      for(int i = 0, j = trim; i < length; i++, j++) 
      { 
       data[i] = from.data[j]; 
      } 
     } 
    } 
    Integer(unsigned int * newData, int len, bool sign) 
    { 
     data = newData; 
     length = len; 
     positive = sign; 
    } 
    static void stripLeadingZeros(unsigned int *& data, int & length) 
    { 
     int i; 
     for(i = 0; i < length; i++) 
     { 
      if(data[i]) 
       break; 
     } 
     if(i == 0) 
      return; 
     int newLen = length - i; 
     unsigned int * tmp = new unsigned int[newLen]; 
     for(int ni = 0; i < length; i++, ni++) 
     { 
      tmp[ni] = data[i]; 
     } 
     delete data; 
     data = tmp; 
     length = newLen; 
    } 
    public: 
    Integer(long long n) 
    { 
     positive = n >= 0; 
     if(!positive) 
      n *= -1; 
     unsigned int highVal = n >> 32; 
     if(highVal == 0) 
     { 
      length = 1; 
      data = new unsigned int[length]; 
      data[0] = (unsigned int)n; 
     } 
     else 
     { 
      length = 2; 
      data = new unsigned int[length]; 
      data[0] = highVal; 
      data[1] = (unsigned int)n; 
     } 
    } 
    /*Integer(int n) 
    { 
     if(n < 0) 
     { 
      positive = false; 
      n *= -1; 
     } 
     length = 1; 
     data = new int[length]; 
     data[0] = n; 
    }*/ 

    Integer(const Integer & from) 
    { 
     copy(from); 
    } 
    Integer & operator=(const Integer& from) 
    { 
     copy(from); 
     return *this; 
    } 
    ~Integer() 
    { 
     if(data != NULL) 
      delete[] data; 
    } 
    void add(Integer & n) 
    { 
     int newLen = max(this->length, n.length) + 1; 
     unsigned int * newData = new unsigned int[newLen]; 
     int carry = 0; 
     long long sum; 
     for(int i = newLen - 1, thisI = this->length - 1, nI = n.length - 1; i >= 0; i--, thisI--, nI--) 
     { 
      sum = (thisI >= 0 ? (long long)this->data[thisI] : 0) + (nI >= 0 ? (long long)n.data[nI] : 0) + carry; 
      newData[i] = sum % BASE; 
      carry = sum/BASE; 
     } 
     if(newData[0] == 0) 
      stripLeadingZeros(newData, newLen); 
     delete[] this->data; 
     this->length = newLen; 
     this->data = newData; 
    } 
    void add(Integer * numbers, int arrLen) 
    { 
     int maxLen = 0; 
     int * positions = new int[arrLen]; 
     for(int i = 0; i < arrLen; i++) 
     { 
      positions[i] = numbers[i].length - 1; 
      maxLen = numbers[i].length > maxLen ? numbers[i].length : maxLen; 
     } 
     int newLen = maxLen + 1; 
     unsigned int * newData = new unsigned int[newLen]; 
     int carry = 0; 
     long long sum; 
     int thisPos = this->length - 1; 
     for(int i = newLen - 1; i >= 0; i--, thisPos--) 
     { 
      sum = (thisPos >= 0 ? this->data[thisPos] : 0) + carry; 
      for(int j = 0; j < arrLen; j++) 
      { 
       sum += positions[j] >= 0 ? numbers[j].data[positions[j]--] : 0; 
      } 
      newData[i] = sum % BASE; 
      carry = sum/BASE; 
     } 
     delete[] positions; 
     if(newData[0] == 0) 
      stripLeadingZeros(newData, newLen); 
     delete[] this->data; 
     this->length = newLen; 
     this->data = newData; 
    } 
    string to_string() 
    { 
     stringstream ss; 
     for(int i = 0; i < length; i++) 
     { 
      ss << "(" <<data[i] << " x " << BASE << "^" << length - i - 1 << (i != length - 1 ? ") + " : ")"); 
     } 
     return ss.str(); 
    } 
}; 
int main() 
{ 
    Integer w(234); 
    Integer x(243); 
    Integer y(234234); 
    Integer z(232); 
    Integer * a = new Integer[3]; // Error 
    a[0] = w; 
    a[1] = x; 
    a[2] = y; 
    z.add(a, 3); 
    cout << x.to_string() << endl; 
    delete[] a; 
    return 0; 
} 

回答

5

由於您的Integer類中沒有默認構造函數,因此會出現錯誤。

當創建一個Integer s的數組時,它試圖調用Integer的缺省構造函數,而沒有任何類沒有提供的參數。

1

您沒有默認的構造函數。

T的默認構造函數看起來像這樣:T::T();它需要一個,因爲new應該構造東西!

+0

它不能只是初始化一切爲NULL?有沒有辦法指定另一個構造函數來調用? – chasep255

+0

@ chasep255定義一個構造函數,將整數設置爲0 –