Печать массива объектов по-прежнему дает те же значения после изменения значений объектов - PullRequest
0 голосов
/ 19 января 2019

Я создаю класс ADT, используя статические массивы, и другой класс под названием «Пациент», содержащий личную информацию людей. Проблема заключается в том, что если я создаю объект Patient и вставляю его в массив, а затем изменяю значение этого объекта, печать массива дает значения старых объектов, даже если печать самого объекта дает измененные значения.

Я добавил оператор = функцию, копирующую значения, но это мне не помогло.

list.h

class List {
private:
  static const int MAX_ELEMENTS = 5;                       
  Patient elements[MAX_ELEMENTS];    
  int elementCount;                                     
public:
  List();
  int  getElementCount() const;
  bool insert(const Patient& newElement);
  void print(); 
};

Patient.h

class Patient {
private:
string name;
string home_address;
string phone_number;
string email_address;
public:
Patient();
Patient(string aName, string anAddress, string Aphone, string anEmail);
Patient(const Patient& obj);
// + all the getters and setters for the private values
friend ostream & operator<<(ostream & os, const Patient & p);
Patient& operator=(const Patient& p);
};

функция Инстерта

bool List::insert(const Patient& newElement)
{
 bool flag = true;
 for (int i = 0; i < elementCount; i++)
  {
    if (elements[i] == newElement)
    {
        flag = false;
        break;
    }
}
if (flag == true && elementCount <= capacity)
{
    elements[elementCount] = newElement;
    elementCount++;
}
else
 flag = false;
 return flag;
}

оператор = функция

Patient & Patient::operator=(const Patient & person)
{
   name = person.name;
   home_address = person.home_address;
   phone_number = person.phone_number;
   email_address = person.email_address;
   return *this;
}

К сожалению, я не могу поделиться файлами .cpp.

Это когда печатается массив только с одним объектом.

Patient: To be entered, To be entered, To be entered, To be entered

Задание имени и адреса электронной почты и печать объекта с использованием собственной перегруженной функции оператора <<, и это желаемый вывод при печати массива. </p>

Patient: bob, To be entered, To be entered, bob@mail.com

Фактическая выработка.

Patient: To be entered, To be entered, To be entered, To be entered

1 Ответ

0 голосов
/ 19 января 2019

Почти наверняка ваш код вставки выглядит следующим образом:

bool List::insert(const Patient& newElement)
{
    ...
    elements[someIndex] = newElement;
    ...
}

Это не помещает newElement в массив, это присваивает его существующему элементу в массиве (т.е. вызываетPatient::operator=).

Таким образом, это два отдельных объекта.Изменение того, что находится вне массива, не влияет на то, что входит в массив, и наоборот.

В List может потребоваться что-то, что может вернуть ссылку на один из объектов массива, чтобы вы могли изменить его.Например,

Patient& List::operator[](size_t index)
{
   //<test here to make sure index is in range>
   return elements[index];
}

Это позволит вам сделать что-то вроде:

Patient& pat = theList[0];
pat.setEmail("test@email.com");

, и элемент в массиве покажет это изменение.


И/ или я неправильно читаю, а вы просто неправильно внедрили operator=.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...