2016-04-21 3 views
0

Напишите массив классов, содержащий массив целых чисел в качестве элемента данных. Класс содержит следующие функции-члены:Как использовать == для сравнения элементов массива

  1. Конструктор, который инициализирует элементы массива до -1.
  2. Функция ввода для ввода значений в массиве.
  3. Показать функцию для отображения значений массива.
  4. Оператор перегрузки == для сравнения значений двух объектов. Перегруженная функция возвращает 1, если все значения обоих объектов одинаковы и в противном случае возвращает 0.

Проблема: я не могу понять, как сравнивать с помощью оператора.

Мой код:

#include<iostream> 
using namespace std; 
#define SIZE 10 
class array{ 
public: 
    int arr[SIZE]; 
public: 
    array(){ 
     for (int i = 0; i < SIZE; i++){ 

      a[i] = -1; 
     } 
    } 

    void input(){ 
-  cout << "Enter values"; 
     for (int i = 0; i < SIZE; i++){ 
      cout << "Enter value number" << i + 1; 
      cin >> arr[i]; 
     } 
    } 

    void show(){ 
     for (int i = 0; i < SIZE; i++){ 
      cout << arr[i]; 
     } 

    } 

    bool operator==(array& p) const 
    { 
     bool result = true; 
     if (p.a != arr) 
      result = false; 

     return result; 
    } 
}; 



int main(){ 

    array arr, b, c; 
    a.input(); 
    b.input(); 
    a.show(); b.show(); 

     return 0; 
} 
+1

Ну, похоже, что это сводится к сравнению массивов. Как бы вы сделали это за пределами класса? – Drop

+4

Если 'this == & p' является' истинным', ваша реализация оператора всегда будет возвращать 'false'. Вероятно, вы захотите сравнить элементы массива один за другим. BTW: Использование 'using namespace std;' и использование класса с именем 'array' может оставить вас в беде. –

+0

@Drop Использование цикла for. – Maya

ответ

1

То, что вы на самом деле хотите, вероятно:

bool operator==(const array& p) const 
      // ^^^^^ 
{ 
    if(this == &p) 
     return true; 
    for(size_t i = 0; i < SIZE; ++i) { 
     if(arr[i] != p.arr[i]) 
     // ^^^   ^^^ 
      return false; 
    } 

    return true; 
} 

Обратите внимание, что есть некоторые другие ошибки в коде:

array(){ 
    for (size_t i = 0; i < SIZE; i++){ 
     // ^^^^^^ 

     arr[i] = -1; 
    // ^^^ 
    } 
} 
1

, что Вы определение равны? Я предполагаю, что вы имеете в виду, что размеры одинаковы, что все элементы одинаковы. Если это так, напишите код, который говорит об этом.

bool operator==(array& p) const 
{ 
    // are size ==, yes they are hard coded to 20 ! not a good plan 
    for (int i = 0; i < 20 ; i++) 
    { 

    if(a[i] != p.a[i]) 
     return false; 
    } 
    return true; 
} 

В коде, который вы написали, указано, что 2 массива равны, если они имеют одинаковый адрес. Т.е. если это тот же массив. может быть, вот что вы имеете в виду

+0

Почему вы используете 'this'? Также вы используете 'this' неправильно. – NathanOliver

+0

Равные массивы означают, что каждый элемент должен быть одного и того же значения. – Maya

+0

@NathanOliver cos i ожидал intellisense, чтобы заполнить вещи для меня (серьезно), и я забыл, что я набирал C++, а не C#, кто-то исправил его в любом случае – pm100

1

Вы не можете сравнивать массивы, как это:

if (p.a != arr) 

Это будет затухать точечные массивы указателей и просто сделать сравнение указателей. Это сравнение указателей будет истинным только в том случае, если &p == this, что вы не хотите. Вы должны были бы фактически вручную сравнить все элементы массива с помощью цикла:

bool operator==(array const& p) const { 
    for (int i = 0; i < SIZE; ++i) { 
     if (arr[i] != p.arr[i]) { 
      return false; 
     } 
    } 
    return true; 
}  

Или вы могли бы просто использовать алгоритм std::equal:

bool operator==(array const& p) const 
{ 
    return std::equal(std::begin(arr), std::end(arr), std::begin(p.arr)); 
} 

Или вы могли бы использовать вместо std::array, который имеет его собственной operator==, определенной для вас:

class array{ 
    std::array<int, SIZE> arr; 
public: 
    bool operator==(array const& p) const { 
     return arr == p.arr; 
    } 
}; 

Хотя это может победить всю цель упражнения.