2015-10-18 2 views
1

Я видел несколько статей, касающихся чего-то подобного, но ни один из них, похоже, мне не помогает. Я был бы признателен, если бы кто-нибудь мог посмотреть на мой код и сказать мне, что я делаю неправильно здесь. Мой учитель не очень помогает. Я закомментировать строки 65 - 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

#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 - предоставьте максимальное предупреждение о компиляторе. Он также не имеет проверки на самоопределение, и у вас нет конструктора копий. Самый простой способ реализовать оператор присваивания - не выполнять их.Другими словами, используйте векторные или другие контейнеры, и компилятор автоматически сгенерирует эти операторы для вас. –

ответ

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: Вы также присвоив размер массива в качестве элементов вновь созданного экземпляра. Скопируйте фактические элементы.

ОБНОВЛЕНИЕ # 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; 

И тогда ваш компилятор не будет, независимо от того, что, забрать по этому вопросу, поскольку он не может присвоить постоянное значение

UPDATE # 3:. Кроме того, как я заметил, вы также позволяет массивы для определения пользовательских начальных/конечных индексов. Но вам нужно будет пересмотреть ваш текущий подход к вычислению индекса, по которому нужно получить элементы в таком случае (где startIndex! = 0). Вы получаете позицию элемента с формулой: «startIndex + (i - 1)». Но в вашем тестовом примере в списке3, где диапазон индексов равен [-2; 6), и вы начинаете цикл for, начальный индекс равен -2 + (-2 - 1) = -2 - 3 = -5. Я не уверен, почему ваш код здесь не рушится, но он должен.

Кроме того, чтобы реализовать операторы сравнения, убедитесь, что сначала размер одного и того же размера, если один из массивов меньше, и вы выполняете итерации по индексам более крупного, он должен сработать, когда вы будете получить доступ к несуществующему индексу (и, если честно, если размеры массивов отличаются - они не равны, не так ли?).

+0

Я изменил этот сегмент кода, чтобы добавить еще один знак =, но ничего не помогло. Любые другие предложения? –

+0

Можете ли вы объяснить, почему вы бы назвали 'delete []' указателем, который вы только что подтвердили, является нулевым? Интересно, что @DonovanKight означает '! =', А не '=='. Если это так, то тест на самом деле лишний, так как удаление нулевого указателя прекрасное и не имеет никакого эффекта. –

+0

@ M.M К сожалению. Отредактировал мой пост. Я слишком привык делать проверки следующим образом: if (NULL == stuff) return; И просто вошел в автоматическую типизацию. Спасибо, что исправил меня. –

Смежные вопросы