2015-10-18 65 views
1

我曾看過幾篇關於類似內容的文章,但沒有一篇似乎對我有所幫助。如果有人能看我的代碼並告訴我我在這裏做錯了,我將不勝感激。我的老師幫不了什麼。在驅動75,因爲我無法得到它與這些編譯,將需要這方面的幫助,以及數組索引超出範圍分配的問題

ArrayDriver.cpp

#include <iostream> 
#include "myArray.h" 
using namespace std; 
int main() 
{ 
myArray<int> list1(5); 
myArray<int> list2(5); 

int i; 

cout << "list1 : "; 
for (i = 0 ; i < 5; i++) 
    cout << list1[i] <<" "; 
cout << endl; 

cout << "Enter 5 integers: "; 
for (i = 0 ; i < 5; i++) 
    cin >> list1[i]; 
cout << endl; 

cout << "After filling list1: "; 

for (i = 0 ; i < 5; i++) 
    cout << list1[i] <<" "; 
cout<< endl; 

list2 = list1; 
cout << "list2 : "; 
for (i = 0 ; i < 5; i++) 
    cout << list2[i] <<" "; 
cout<< endl; 

cout << "Enter 3 elements: "; 

for (i = 0; i < 3; i++) 
    cin >> list1[i]; 
cout << endl; 

cout << "First three elements of list1: "; 
for (i = 0; i < 3; i++) 
    cout << list1[i] << " "; 
cout << endl; 

myArray<int> list3(-2, 6); 

cout << "list3: "; 
for (i = -2 ; i < 6; i++) 
    cout << list3[i] <<" "; 
cout<< endl; 

list3[-2] = 7; 
list3[4] = 8; 
list3[0] = 54; 
list3[2] = list3[4] + list3[-2]; 

cout << "list3: "; 
for (i = -2 ; i < 6; i++) 
    cout << list3[i] <<" "; 
cout<< endl; 
/* 
if (list1 == list2) 
    cout << " list 1 is equal to list2 " << endl; 
else 
    cout << " list 1 is not equal to list2" << endl; 

if (list1 != list2) 
    cout << " list 1 is not equal to list2 " << endl; 
else 
    cout << " list 1 is equal to list2" << endl; 
    */ 
//10% EXTRA CREDIT: UNCOMMENT CODE IF YOU'VE SUCCESSFULLY IMPLEMENTED THE FOLLOWING: 
//cout << list1<< (list1 == list2 ? " is equal to" : " not equal to ") << list2 << endl; 
//cout << list1<< (list1 != list2 ? " not equal to" : " is equal to ") << list2 << endl; 
return 0; 
} 

myArray.h - 我註釋掉線65

#ifndef MYARRAY_H 
#define MYARRAY_H 

//#pragma once 
#include <iostream> 
//#include <assert.h> 
//#include <iomanip> 
//#include <string> 

using namespace std; 

template <class DataType> 
class myArray 
{ 
//overload for << 
//friend ostream& operator<<(ostream& out, myArray<DataType>& arr); 
//overload for >> 
friend istream& operator>>(istream& in, myArray<DataType>& arr); 

public: 
//myArray(); 
myArray(int size); 
myArray(int start, int end); 
//~myArray(); 

//overload [] 
DataType& operator[](int i); 
//overload == operator 
friend bool operator==(myArray<DataType> &arr1, myArray<DataType> &arr2); 
//overload != operator 
friend bool operator!=(myArray<DataType> &arr1, myArray<DataType> &arr2); 
//overload = opertator 
myArray<DataType> &operator=(const myArray<DataType> &rhs) 
{ 
    if (myDataType != NULL) 
     delete[]myDataType; 
    myDataType = new DataType[rhs.arraySize]; 
    arraySize = rhs.arraySize; 
    for (int i = 0; i < arraySize; i++) 
     myDataType[i] = rhs.myDataType[i]; 

    return *this; 
} 

//function 
void SetNULL(); 
protected: 
int startIndex; 
int endIndex; 
int arraySize; 

//template 
DataType *myDataType; 
}; 

#endif 

template <class DataType> 
DataType& myArray<DataType>::operator[](int i) 
{ 
if (i > arraySize) 
{ 
    cout << "Array out of bounds: " << endl; 
} 
else if (startIndex == 0) 
{ 
    return myDataType[i]; 
} 
else 
{ 
    return myDataType[(startIndex + (i - 1))]; 
} 
} 

template <class DataType> 
myArray<DataType>::myArray(int size) : 
arraySize(size), startIndex(0), endIndex(size) 
{ 
myDataType = new DataType[arraySize]; 
SetNULL(); 
} 

template <class DataType> 
myArray<DataType>::myArray(int start, int end) : 
startIndex(start), endIndex(end) 
{ 

if (start > end) 
{ 
    cout << "Invalid start position: " << endl; 
} 
else 
{ 
    arraySize = end - start; 

} 

myDataType = new DataType[arraySize]; 
SetNULL(); 
} 

template <class DataType> 
void myArray<DataType>::SetNULL() 
{ 
for (int i = startIndex; i < endIndex; i++) 
{ 
    myDataType[i] = (DataType)0; 
} 
} 

//overload == operator 
template <class DataType> 
bool operator==(myArray<DataType> &arr1, myArray<DataType> &arr2) 
{ 
bool testBool = true; 

for (int i = 0; i < arraySize; i++) 
{ 
    if (arr1[i] != arr2[i]) 
    { 
     testBool = false; 
    } 
} 

return testBool; 
} 

//overload != operator 
template <class DataType> 
bool operator!=(myArray<DataType> &arr1, myArray<DataType> &arr2) 
{ 
bool testBool = true; 

for (int i = 0; i < arraySize; i++) 
{ 
    if (arr1[i] == arr2[i]) 
    { 
     testBool = false; 
    } 
} 

return testBool; 
} 

//overload >> operator 
template <class DataType> 
istream& operator>> (istream &in, myArray<DataType> &aList) 
{ 
for (int i = 0; i < aList.arraySize; i++) 
    in >> aList.list[i]; 

return in; 
} 
+0

我遇到的問題是Null函數似乎沒有工作。我的老師告訴我要添加operator =功能,並搞砸了「list2」,將其設置爲要求輸入5位數字時輸入的最後一位數字。 –

+0

您的賦值運算符在if語句中存在嚴重錯誤 - 請將編譯器警告設置爲最高。它也缺少對自賦值的檢查,並且沒有拷貝構造函數實現賦值運算符的最簡單方法是不需要實現它們。換句話說,使用vector或其他容器,編譯器會自動爲你生成這些運算符。 –

回答

0

這就是爲什麼不忽略警告(或使用調試器)是有幫助的。我的編譯器顯示了這個問題(通過警告),這應該是你問題的罪魁禍首。

在功能:

myArray<DataType> &operator=(const myArray<DataType> &rhs) 
{ 
    if (myDataType = NULL) 
     delete[]myDataType; 
    myDataType = new DataType[rhs.arraySize]; 
    arraySize = rhs.arraySize; 
    for (int i = 0; i < arraySize; i++) 
     myDataType[i] = rhs.arraySize; 

    return *this; 
} 

UPDATE:您還指定數組的大小爲新創建的副本元素。複製實際元素。

UPDATE#2:正如其他評論者所指出的,您也忘了檢查自我分配。檢查當前數組的數組指針是否等於您正在分配的數組指針。

您正在做一項任務而不是在第一個if語句中進行比較。考慮這樣做:

myArray<DataType> &operator=(const myArray<DataType> &rhs) 
{ 
    if (myDataType == rhs.myDataType) //CHECK IF THE ARRAY IS THE SAME (self-assignment case). 
     return *this; 
    // Missing '!' character here!!! 
    if (myDataType != NULL) 
     delete[]myDataType; 
    myDataType = new DataType[rhs.arraySize]; 
    arraySize = rhs.arraySize; 
    for (int i = 0; i < arraySize; i++) 
     myDataType[i] = rhs.myDataType[i]; // COPY ACTUAL ELEMENTS INSTEAD OF WRITTING ARRAY SIZE. 

    return *this; 
} 

,爲避免今後發生此類問題(如果你的編譯器不拿起這樣的問題,可考慮做比較,具有恆定值,如:

if (NULL != myDataType) 
    delete[]myDataType; 

然後你的編譯器,不管是什麼,拿起這個問題,因爲它不能分配到一個恆定值

更新#3:而且,我注意到,你還允許數組擁有用戶定義的開始/結束索引。但是,您需要重新考慮計算索引的當前方法,以便在這種情況下獲取元素(其中startIndex!= 0)。你用公式得到元素的位置:'startIndex +(i - 1)'。但是在你的測試用例中,在list3中,索引範圍是[-2; 6),然後開始你的for循環,初始索引等於-2 +(-2-1)= -2-3 = -5。我不知道爲什麼你的代碼不會在這裏崩潰,但它應該。

此外,要實現比較運算符,首先檢查大小是否相同,因爲如果其中一個數組較小,並且您正在遍歷較大的索引,那麼它應該會崩潰,當您訪問不存在的索引(老實說,如果數組大小不同 - 它們不相等,是嗎?)。

+0

我改變了這段代碼來添加一個=符號,但它沒有任何幫助。還有其他建議嗎? –

+0

你能解釋一下你爲什麼要在剛剛確認的指針上調用'delete []'爲null?我想知道@DonovanKight是否意味着'!='而不是'=='。如果是這樣,那麼測試實際上是多餘的,因爲刪除空指針是好的並且沒有效果。 –

+0

@ M.M Oops。編輯我的帖子。我太習慣於按照以下方式進行檢查:if(NULL == stuff)return;然後,進入自動打字。謝謝你糾正我。 –